注册 登录
编程论坛 C语言论坛

请教各位大咖,帮帮忙!

我莹莹 发布于 2020-02-26 12:49, 2207 次点击
https://www.bccn.net/run/
我在这个在线编程里输入代码,代码是网上找到,本人一点都不会的,为什么都运行不起来,谁能指导我一下。
我要那个证明数字黑洞6174的代码,感谢你的帮助!
10 回复
#2
八画小子2020-02-26 13:16
只有本站会员才能查看附件,请 登录
#3
我莹莹2020-02-26 13:38
回复 2楼 八画小子
就在这里,可是自己照过来的放进去就不可以
#4
自学的数学2020-02-26 13:39
程序代码:
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define num_1 8999
void vr6174(int);
void parse_sort(int num,int *each);
void max_min(int *each,int *max,int *min);
void parse_sort(int num,int *each);
int count=0;
void main()
{
int n;
int cou=0,num_max;
srand(time(0)); /*设置种子,并生成伪随机序列*/
for(int i=0;i<N;i++)
{
printf("第%d组数据\n",i+1);
n=rand()%1000;/*生成0~9999随机数*/
if(n<1000)
{
n+=1000;
}
vr6174(n); //调用函数进行验证
if(count>cou)
{
num_max=n;
cou=count;
}
count=0;
}
printf("最大次数:%d,数字是:%d\n",cou,num_max);
}
void vr6174(int num)
{
int each[4],max,min;
if(num!=6174&&num) /*若不等于74且不等于0则进行卡布列克运算*/
{
parse_sort(num,each); /*将整数分解,数字存入each数组中*/
max_min(each,&max,&min); /*求数字组成的最大值和最小值*/
num=max-min; /*求最大值和最小值的差*/
printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*输出该步计算过程*/
vr6174(num); /*递归调用自身继续进行卡布列克运算*/
}
}
void parse_sort(int num,int *each)
{
int i,*j,*k,temp;
for(i=0;i<=4;i++) /*将NUM分解为数字*/
{
j=each+3-i;
*j=num%10;
num/=10;
}
for(i=0;i<3;i++) /*对各保数字从小到大进行排序*/
for(j=each,k=each+1;j<each+3-i;j++,k++)
if(*j>*k) { temp=*j;*j=*k;*k=temp;}
return;
}
void max_min(int *each,int *max,int *min) /*将分解的数字还原为最大整数和最小整数*/
{
int *i;
*min=0;
for(i=each;i<each+4;i++) /*还原为最小的整数*/
*min=*min*10+*i;
*max=0;
for(i=each+3;i>=each;i--) /*还原为最大的整数*/
*max=*max*10+*i;
return;
}
#5
八画小子2020-02-26 14:20
截图
#6
我莹莹2020-02-28 16:02
回复 4楼 自学的数学
谢谢大咖指导。
您发给的是随机的,有没有跳出对话框输入自己的数,再出示验证过程的算式,这样的编程?
感谢感谢!
#7
林月儿2020-02-28 16:15
啥叫数字黑洞?
#8
林月儿2020-02-28 17:25
程序代码:
#include <stdio.h>
#include <stdlib.h>

int sort_func(const void * a, const void * b) {
   return *(int*)a - *(int*)b;
}

int main () {
    printf("请输入四位数:");
    int n,i;
    scanf("%d", &n);// 输入四位数
    printf("\n输入的四位数为:%d\n", n);
    int prev = 0;// 上一个数
    int cur = n; // 当前数
    int times = 0;// 次数
    int str[4];
    printf("times\tprev\tcur");
    do {
        prev = cur;// 保存上一轮生成的数
        i = 3;
        // 整理成数组
        while(i >= 0) {
            str[i--] = cur%10;
            cur /= 10;
        }
        // 按从小到大排序,参数分别为 数组,长度,单位长度,比较规则的自定义函数
        qsort(str, 4, sizeof(int), sort_func);
        cur = 0;
        // 生成新的数更新当前值
        for (i = 3; i >= 0; i--) {
            cur *= 10;
            cur += str[i] - str[3-i];
        }
        times++;
        printf("\n%d:\t%d\t%d", times, prev, cur);
    }while (cur != prev);// 当前一个数和后一个重复,跳出循环
    return 0;
}

只有本站会员才能查看附件,请 登录
#9
林月儿2020-02-28 17:28
百度了下,然后试着写了一段,不确定对不对
#10
自学的数学2020-02-29 11:28
回复 7楼 林月儿
黑洞数又称陷阱数,类具有奇特转换特性整数,任何数字全相同整数,经有限重排求差操作,总会得某或些数,这些数即黑洞数重排求差操作即把组成该数数字重排得大数减去重排得小数。
黑洞原是天文学中的概念,表示这样一种天体:它的引力场是如此之强,就连光也不能逃脱出来。数学中借用这个词,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点的情况叫数字黑洞。
西绪福斯黑洞(123数字黑洞)
数学中的123就跟英语中的ABC一样平凡和简单。然而,按以下运算顺序,就可以观察到这个最简单的数字。
黑洞的值:
设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数,
例如:1234567890,
1.偶:数出该数数字中的偶数个数,在本例中为2,4,6,8,0,总共有 5 个。
2.奇:数出该数数字中的奇数个数,在本例中为1,3,5,7,9,总共有 5 个。
3.总:数出该数数字的总个数,本例中为 10 个。
4.新数:将答案按 “偶-奇-总” 的位序,排出得到新数为:5510。
5.重复:将新数5510按以上算法重复运算,可得到新数:134。
6.重复:将新数134按以上算法重复运算,可得到新数:123。
结论:对数1234567890,按上述算法,最后必得出123的结果,我们可以用计算机写出程序,测试出对任意一个数经有限次重复后都会是123。换言之,任何数的最终结果都无法逃逸123黑洞……
卡普雷卡尔黑洞(重排求差黑洞)
1.三位数黑洞495:
只要你输入一个三位数,要求个,十,百位数字不相同,如不允许输入111,222等。那么你把这个三位数的三个数字按大小重新排列,得出最大数和最小数,两者相减得到一个新数,再按照上述方式重新排列,再相减,最后总会得到495这个数字。
举例:输入352,排列得最大数位532,最小数为235,相减得297;再排列得972和279,相减得693;接着排列得963和369,相减得594;最后排列得到954和459,相减得495。
2.四位数黑洞6174:
把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数,这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变成 6174。
例如 3109,9310 - 0139 = 9171,9711 - 1179 = 8532,8532 - 2358 = 6174。而 6174 这个数也会变成 6174,7641 - 1467 = 6174。
任取一个四位数,只要四个数字不全相同,按数字递减顺序排列,构成最大数作为被减数;按数字递增顺序排列,构成最小数作为减数,其差就会得6174;如不是6174,则按上述方法再作减法,至多不过7步就必然得到6174。
如取四位数5679,按以上方法作运算如下:
9765-5679==4086,8640-0468=8172,
8721-1278=7443, 7443-3447=3996,
9963-3699=6264, 6642-2466=4176
7641-1467=6174
那么,出现6174的结果究竟有什么科学依据呢?
设M是一个四位数而且四个数字不全相同,把M的数字按递减的次序排列,
记作M(减);
然后再把M中的数字按递增次序排列,记作M增,记差M(减)-M(增)=D1,从M到D1是经过上述步骤得来的,我们把它看作一种变换,从M变换到D1记作:T(M)= D1把D1视作M一样,按上述法则做减法得到D2 ,也可看作是一种变换,把D1变换成D2,
记作:T(D1)= D2
同样D2可以变换为D3;D3变换为D4……,既T(D2)= D3,T(D3)= D4……
要证明,至多是重复7次变换就得D7=6174。
证明
证:四位数总共有9999-999=9000个,其中除去四个数字全相同的,余下9000-9=8991个数字不全相同.我们首先证明,变换T把这8991个数只变换成54个不同的四位数.
设a、b、c、d是M的数字,并:
a≥b≥c≥d
因为它们不全相等,上式中的等号不能同时成立.我们计算T(M)
M(减)=1000a+100b+10c+d
M(增)=1000d+100c+10b+a
T(M)= D1= M(减)-M(增)=1000(a-d)+100(b-c)+10(c-b)+d-a=999(a-d)+90(b-c)
我们注意到T(M)仅依赖于(a-d)与(b-c),因为数字a,b,c,d不全相等,因此由a≥b≥c≥d可推出;a-d>0而b-c≥0.
此外b、c在a与d之间,所以a-d≥b-c,这就意味着a-d可以取1,2,…,9九个值,并且如果它取这个集合的某个值n,b-c只能取小于n的值,至多取n.
例如,若a-d=1,则b-c只能在0与1中选到,在这种情况下,T(M)只能取值:
999×⑴+90×(0)=0999
999×⑴+90×⑴=1089
类似地,若a-d=2,T(M)只能取对应于b-c=0,1,2的三个值.把a-d=1,a-d=2,…,a-d=9的情况下b-c所可能取值的个数加起来,我们就得到2+3+4+…+10=54
这就是T(M)所可能取的值的个数.在54个可能值中,又有一部分是数码相同仅仅是数位不同的值,这些数值再变换T(M)中都对应相同的值(数学上称这两个数等价),剔除等价的因数,在T(M)的54个可能值中,只有30个是不等价的,它们是:
9990,9981,9972,9963,9954,9810,9711,9621,9531,9441,8820,8730,8721,8640,8622,8550,
8532,8442,7731,7641,7632,7551,7533,7443,6642,6552,6543,6444,5553,5544.
对于这30个数逐个地用上述法则把它换成最大与最小数的差,至多6步就出现6174这个数.证毕.
推广
一、任意N位数都会类似4位数那样归敛(1、2位数无意义) . 3位数归敛到唯一一个数495; 4位数归敛到唯一一个数6174; 7位数归敛到唯一一个数组(8个7位数组成的循环数组______称归敛组);其它每个位数的数归敛结果分别有若干个,归敛数和归敛组兼而有之(如14位数____共有9×10的13次方个数____的归敛结果有6个归敛数,21个归敛组). 以上提到的所有归敛结果(包括一个数字、一个数组或兼有)称为“卡普雷卡尔常数”.
“卡普雷卡尔常数”中的所有的数都是模9数(即都能被9整除以及其全部数字之和也是9的倍数!)
一旦进入归敛结果,继续卡普雷卡尔运算就在归敛结果反复循环,再也“逃”不出去。
归敛组中各数可以按递进顺序交换位置 (如a → b → c 或 b → c → a 或c → a → b)
归敛结果可以不经过卡普雷卡尔运算就能从得出.
某个既定位数的数,它的归敛结果的个数是有限的,也是确定的.
二、较多位数的数(命它为N)的归敛结果是由较少位数的数(命它为n,N>n)的归敛结果,嵌加进去一些特定的数或数组而派生形成。4、6、8、9、11、13的归敛结果中的8个称基础数根.它们是派生所有任意N位数的归敛结果的基础。
1、嵌加的数分三类.
第一类是数对型,有两对:
1) 9,0
2) 3,6
第二类是数组型,有一组:
1) 7,2
2) 5,4
3) 1,8
第三类是数字型,有两个:
1) 5 9 4
2) 8 6 4 2 9 7 5 3 1
2、嵌入数的一部分嵌入前段中大于或等于嵌入数的最末一个数字的后邻位置。另一部分嵌入后段相应位置_____使与嵌入前段的数形成层状组数结构。
594只能嵌入n=3+3К 这类数。如9、12、15、18…….位.
3、(9,0)、(3,6)两对数可以单独嵌入或与数组型、数字型组合嵌入。
数组
7,2
5,4
1,8
必须“配套”嵌入并按顺序: (7,2)→(5,4)→(1,8)或 (5,4)→(1,8)→(7,2)
或 (1,8) →(7,2)→(5,4)。
4,可以嵌如一次、二次或若干次 (则形成更多位数的归敛结果).
任意N位数的归敛结果都 “隐藏”在这N位数中,卡普雷卡尔运算只是找出它们而不是新造成它们。
水仙花数黑洞
数字黑洞153
任意找一个3的倍数的数,先把这个数的每一个数位上的数字都立方,再相加,得到一个新数,然后把这个新数的每一个数位上的数字再立方、求和,......,重复运算下去,就能得到一个固定的数——153,我们称它为数字“黑洞”。
例如:
1、63是3的倍数,按上面的规律运算如下:
6^3+3^3=216+27=243,
2^3+4^3+3^3=8+64+27=99,
9^3+9^3=729+729=1458,
1^3+4^3+5^3+8^3=1+64+125+512=702
7^3+0^3+2^3=351,
3^3+5^3+1^3=153,
1^3+5^3+3^3=153,
2、3*3*3=27,
2*2*2+7*7*7=351,
3*3*3+5*5*5+1*1*1=153
...
继续运算下去,结果都为153,如果换另一个3的倍数,试一试,仍然可以得到同样的结论,因此153被称为一个数字黑洞。
除了0和1自然数中各位数字的立方之和与其本身相等的只有153、370、371和407(此四个数称为“水仙花数”)。例如为使153成为黑洞,我们开始时取任意一个可被3整除的正整数。分别将其各位数字的立方求出,将这些立方相加组成一个新数然后重复这个程序.
除了“水仙花数”外,同理还有四位的“玫瑰花数”(有:1634、8208、9474)、五位的“五角星数”(有54748、92727、93084),当数字个数大于五位时,这类数字就叫做“自幂数”。
“4、2、1”黑洞
当你列举出一个数时(0、负数除外的整数),无论它是奇数还是偶数,只要是奇数就将它×3+1,只要是偶数就将它÷2,一直重复循环,最终一定是“4——2——1”结尾。

还有就是可以参考我前不久写的关于水仙花数的扩展一文。

[此贴子已经被作者于2020-2-29 11:29编辑过]

#11
林月儿2020-02-29 11:31
回复 10楼 自学的数学
1