#include <stdioh>
void sort(int a[],int left,int right)
{
int i,j,t;
i=left,j=right+1;
if(left<right){
while(1){
while(i+1<right+1&&a[++i]<a[left]);
while(j-1>left-1&&a[--j]>a[left]);
if(i>=j)break;
t=a[i],a[i]=a[j],a[j]=t;
}
t=a[left],a[left]=a[j],a[j]=t;
sort(a,left,j-1);
sort(a,j+1,right);
}
}
int main()
{
int a,b[4],ma,mi,i;
scanf("%d",&a);
for(;;)
{
for(i=0;i<4;i++)b[i]=a%10,a/=10;
sort(b,0,3);
ma=b[3]1000+b[2]100+b[1]10+b[0];
mi=b[3]+b[2]10+b[1]100+b[0]1000;
a=ma-mi;
printf("%d-%d=%d\n",ma,mi,a);
if(a==6174)break;
}
return 0;
}
想了很久,在VC++60中调试了差不多半天,现在把求三位数和四位数中的黑洞数的程序写出来了(按定义可知一位和二位数中不存在黑洞数),现在贴出来供大家批评指正:(五位数中黑洞数的求解代码待续)
#include <iostream>
#include <stdioh>
using namespace std;
int maxof3(int,int,int); //求三位数重排后的最大数
int minof3(int,int,int); //求三位数重排后的最小数
int maxof4(int,int,int,int); //求4位数重排后的最大数
int minof4(int,int,int,int); //求4位数重排后的最大数
void main()
{
int i;
for(i=100;i<=999;i++) //求三位数中的黑洞数
{
int hun,oct,data,max,min,j;
hun=i/100; oct=i%100/10; data=i%10;
max=maxof3(hun,oct,data);
min=minof3(hun,oct,data);
j=max-min;
hun=j/100; oct=j%100/10; data=j%10;
if(min==minof3(hun,oct,data))
cout<<i<<" is a blackhole number!"<<endl;
}
for(i=1000;i<=9999;i++) //求四位数中的黑洞数
{
int t,h,d,a,max,min,j;
t=i/1000; h=i%1000/100; d=i%100/10; a=i%10;
max=maxof4(t,h,d,a);
min=minof4(t,h,d,a);
j=max-min;
t=j/1000; h=j%1000/100; d=j%100/10; a=j%10;
if(min==minof4(t,h,d,a))
cout<<i<<" is a blackhole number !"<<endl;
}
}
int maxof3(int a,int b,int c)
{
int t;
t=a;
if(b>t)
{t=b;b=a;a=t;}
if(c>t)
{t=c;c=b;b=a;a=t;}
else
{if(c>b)
{t=c;c=b;b=t;}
}
return(a100+b10+c);
}
int minof3(int a,int b,int c)
{
int t;
t=a;
if(b>t)
{t=b;b=a;a=t;}
if(c>t)
{t=c;c=b;b=a;a=t;}
else
{if(c>b)
{t=c;c=b;b=t;}
}
return(c100+b10+a);
}
int maxof4(int a,int b,int c,int d)
{
if(a<b)
{a=a^b;b=a^b;a=a^b;}
if(c<d)
{c=c^d;d=c^d;c=c^d;}
if(a<c)
{a=a^c;c=a^c;a=a^c;}
if(b<d)
{b=b^d;d=b^d;b=b^d;}
if(b<c)
{b=b^c;c=b^c;b=b^c;}
return(a1000+b100+c10+d);
}
int minof4(int a,int b,int c,int d)
{
if(a<b)
{a=a^b;b=a^b;a=a^b;}
if(c<d)
{c=c^d;d=c^d;c=c^d;}
if(a<c)
{a=a^c;c=a^c;a=a^c;}
if(b<d)
{b=b^d;d=b^d;b=b^d;}
if(b<c)
{b=b^c;c=b^c;b=b^c;}
return(d1000+c100+b10+a);
}
另外谢了一个求解五位数中的黑洞数的程序,把部分代码复制到上面那个文件中就可以了:
#include <iostream>
using namespace std;
int maxof5(int,int,int,int,int);
int minof5(int,int,int,int,int);
void main()
{
int i;
for(i=10000;i<=50000;i++)
{
int dt,t,h,d,a,max,min,j;
dt=i/10000; t=i%10000/1000; h=i%1000/100; d=i%100/10; a=i%10;
max=maxof5(dt,t,h,d,a);
min=minof5(dt,t,h,d,a);
j=max-min;
dt=j/10000; t=j%10000/1000; h=j%1000/100; d=j%100/10; a=j%10;
if(min==minof5(dt,t,h,d,a))
cout<<i<<" is a blackhole number!"<<endl;
}
cout<<"maxof5(5,2,1,8,3) is : "<<maxof5(5,2,1,8,3)<<endl; //这行是测试用的
cout<<"minof5(5,2,1,8,3) is : "<<minof5(5,2,1,8,3)<<endl; //这行是测试用的,看看求解函
//数是否正确
}
int maxof5(int a,int b,int c,int d,int e)
{
int t;
if(a<b)
{a=a^b;b=a^b;a=a^b;}
if(c<d)
{c=c^d;d=c^d;c=c^d;}
if(a<c)
{a=a^c;c=a^c;a=a^c;}
if(b<d)
{b=b^d;d=b^d;b=b^d;}
if(b<c)
{b=b^c;c=b^c;b=b^c;}
if(e<=d)
{}
else
if(d<=e&&e<c)
{t=d;d=e;e=t;}
else
if(c<=e&&e<b)
{t=c;c=e;e=d;d=t;}
else
if(b<=e&&e<a)
{t=b;b=e;e=d;d=c;c=t;}
else
if(a<=e)
{t=a;a=e;e=d;d=c;c=b;b=t;}
else {cout<<"please check the program!"<<endl;}
return(a10000+b1000+c100+d10+e);
}
int minof5(int a,int b,int c,int d,int e)
{
int t;
if(a<b)
{a=a^b;b=a^b;a=a^b;}
if(c<d)
{c=c^d;d=c^d;c=c^d;}
if(a<c)
{a=a^c;c=a^c;a=a^c;}
if(b<d)
{b=b^d;d=b^d;b=b^d;}
if(b<c)
{b=b^c;c=b^c;b=b^c;}
if(e<=d)
{}
else
if(d<=e&&e<c)
{t=d;d=e;e=t;}
else
if(c<=e&&e<b)
{t=c;c=e;e=d;d=t;}
else
if(b<=e&&e<a)
{t=b;b=e;e=d;d=c;c=t;}
else
if(a<=e)
{t=a;a=e;e=d;d=c;c=b;b=t;}
else {cout<<"please check the program!"<<endl;}
return(e10000+d1000+c100+b10+a);
}
123数字黑洞
黑洞原是天文学中的概念,表示这样一种天体:它的引力场是如此之强,就连光也不能逃脱出来。数学中借用这个词,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点。数字黑洞运算简单,结论明了,易于理解,故人们乐于研究。但有些证明却不那么容易。
任取一个数,相继依次写下它所含的偶数的个数,奇数的个数与这两个数字的和,将得到一个正整数。对这个新的数再把它的偶数个数和奇数个数与其和拼成另外一个正整数,如此进行,最后必然停留在数123。
例:所给数字 14741029
第一次计算结果 448
第二次计算结果 303
第三次计算结果 123
------------------------------------------------------------------
数字黑洞495
只要你输入一个三位数,要求个,十,百位数字不相同,如不允许输入111,222等。那么
你把这三个数字按大小重新排列,得出最大数和最小数。再两者相减,得到一个新数,再重新排列,再相减,最后总会得到495这个数字,人称:数字黑洞。
举例:输入352,排列得532和235,相减得297;再排列得972和279,相减得693;排列得963和369,相减得594;再排列得954和459,相减得495。
应该只是一种数字规律吧,像这样的还有狠多,比如四位数的数字黑洞6174:
把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数,这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变成 6174。
例如 3109,9310 - 0139 = 9171,9711 - 1179 = 8532,8532 - 2358 = 6174。而 6174 这个数也会变成 6174,7641 - 1467 = 6174。
----------------------------------------------------------------------------------
任取一个四位数,只要四个数字不全相同,按数字递减顺序排列,构成最大数作为被减数;按数字递增顺序排列,构成最小数作为减数,其差就会得6174;如不是6174,则按上述方法再作减法,至多不过7步就必然得到6174。
如取四位数5462,按以上方法作运算如下:
6542-2456=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。
证:四位数总共有104=10000个,其中除去四个数字全相同的,余下104-10=9990个数字不全相同.我们首先证明,变换T把这9990个数只变换成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×(1)+90×(0)=0999
999×(1)+90×(1)=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,5553,5544.
对于这30个数逐个地用上述法则把它换成最大与最小数的差,至多6步就出现6174这个数.证毕.
----------------------------------------------------------------------------------
数字黑洞153
任意找一个3的倍数的数,先把这个数的每一个数位上的数字都立方,再相加,得到一个新数,然后把这个新数的每一个数位上的数字再立方、求和,,重复运算下去,就能得到一个固定的数——153,我们称它为数字“黑洞”。
例如: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,
现在继续运算下去,结果都为153,如果换另一个3的倍数,试一试,仍然可以得到同样的结论,因此153被称为一个数字"黑洞"
个人在思考6174之谜时,突破点就是上面提到的495的规律。我发现无论是三位、还是四位、五位。都或多或少有自己的规律。个人认为规律的根本原因在于数字的重新排列,正是这种正反序列相减,再加上十进制的原则,让它变得有规律。
你这个应该是 abcd排序的那里有问题,到最后还剩一个 cd没有排序
你加一个 if(c<d){t=d;d=c;c=t;}在排序的最后试试
好吧,看了另一位道友的回答才看出来,你还没有输出
123数字黑洞
黑洞原是天文学中的概念,表示这样一种天体:它的引力场是如此之强,就连光也不能逃脱出来。数学中借用这个词,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点。数字黑洞运算简单,结论明了,易于理解,故人们乐于研究。但有些证明却不那么容易。
数字黑洞是指某些数字经过一定的运算得到一个循环或确定的答案,比如黑洞数6174:随便选一个四位数,如1628,先把组成的四个数字从大到小排列得到8621,再把原数1628的四个数字由小到大排列得到1268,用大的减小的:8621-1268=7353。按上面的办法重复,由大到小排列7353,得到7533,由小到大排列得到3357,大减小:7533-3357=4176,把4176再重复一遍,得7641-1467=6174。所以6174就是一个黑洞数字。
任取一个数,相继依次写下它所含的偶数的个数,奇数的个数与这两个数字的和,将得到一个正整数。对这个新的数再把它的偶数个数和奇数个数与其和拼成另外一个正整数,如此进行,最后必然停留在数123。
例:所给数字 14741029
第一次计算结果 448
第二次计算结果 303
第三次计算结果 123
将三个数字的和乘以2,得数作为重组三位数的百位数和十位数;将原数的十位数字与个位数字的和(若得两位数,再将数字相加得出和),作为新三位数的个位数。此后,再对重组的三位数重复这一过程,你将看到,必有一数堕落陷阱。
如,任写一个数843,按要求,其转换过程是:
(8+4+3)×2=30……作新三位的百位、十位数。
4+3=7……作新三位数的个位数。
组成新三位数307,重复上述过程,继续下去是:307→207→187→326→228→241→145→209→229→262→208→208→……
结果,208落入“陷阱”。
再如:411,按要求,其转换过程是:
411→122→104→104→……
结果,104落入了陷阱。
假如将三位数按照下面的规则运算下去,同样会出现数字“陷阱”。
1若是3的倍数,便将该数除以3。
2若不是3的倍数,便将各数位的数加起来再平方。
如:126
结果进入“169-256”的死循环,再也跳不出去了!
再如:368
结果,1进入了“黑洞”。
另有一种方法,可以把任何一个多位数,迅速地推入“陷阱”。
*** 作方法是:
第一步:数出多位数含有偶数(包括0)的个数,并以它作新数的百位数;
第二步:数出多位数含有奇数的个数,并以它作新数的十位数。
第三步:将位数所含数字作新数的个位数。组成新数后,对新数重复上述过程。
如:7432581
数字黑洞495,只要你输入一个三位数的数字,要求一个、十个、一百个数字都不一样,比如不允许输入111222等等。然后根据大小重新排列这三个数字,得到最大值和最小值。然后把这两个数字相减,得到一个新的数字,重新排列,再减去,最后得到数字495,这就是所谓的数字黑洞。例如:输入352,排列532和235,减法297;排列972和279,减法693;排列963和369,减法594;排列954和459,减法495。
以上就是关于C++ 程序设计,数字黑洞6174全部的内容,包括:C++ 程序设计,数字黑洞6174、求C语言高手帮忙,做一个程序,求出1~50000内的所有“黑洞数”。谢谢了!(内有关于黑洞数的东西)、用c++编程求黑洞运算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)