导航:首页 > 编程语言 > 编程黑洞陷阱

编程黑洞陷阱

发布时间:2023-03-31 01:35:54

⑴ 求C语言高手帮忙,做一个程序,求出1~50000内的所有“黑洞数”。谢谢了!(内有关于黑洞数的东西)

想了很久,在VC++6.0中调试了差不多半天,现在把求三位数和四位数中的黑洞数的程序写出来了(按定义可知一位和二位数中不存在黑洞数),现在贴出来供凯喊大家批评指正:(五位数中黑洞数的求解代码待续)

#include <iostream>
#include <stdio.h>
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(a*100+b*10+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(c*100+b*10+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(a*1000+b*100+c*10+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(d*1000+c*100+b*10+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(a*10000+b*1000+c*100+d*10+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(e*10000+d*1000+c*100+b*10+a);
}

⑵ 数字黑洞6174原理是什么

四位数黑洞6174原理如下:

把一个四位数的四个数字由小至大排汪嫌迅列,组成一个新数,又由大至小排列排列组成一个新数,这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变困此成 6174。

例如 3109,9310 - 0139 = 9171,9711 - 1179 = 8532,8532 - 2358 = 6174。而 6174 这个数也会变成 6174,7641 - 1467 = 6174。

任取一个四位数,只要四个数字不全相同,按数字递减顺序排列,构成最大数作为被减数,按数字递增顺序排列,构成最小数作为减数,其差就会得6174,如不是6174,则按上述方法再作减法,至多不过10步就必然得到6174。

假如将三位数按照下面的者亮规则运算下去,同样会出现数字“陷阱”。

(1)若是3的倍数,便将该数除以3。

(2)若不是3的倍数,便将各数位的数加起来再平方。

如:126

结果进入“169-256”的死循环,再也跳不出去了。再如:368 ,结果,1进入了“黑洞”。

另有一种方法,可以把任何一个多位数,迅速地推入“陷阱”。

操作方法是:

第一步:数出多位数含有偶数(包括0)的个数,并以它作新数的百位数。

第二步:数出多位数含有奇数的个数,并以它作新数的十位数。

第三步:将位数所含数字作新数的个位数,组成新数后,对新数重复上述过程。

⑶ 数字黑洞算法用迭代公式是什么

数字黑洞算法用迭代公式:xi(t+1)=xi(t)+rand*(xrh-xi(t))。数字黑洞,又称指的是某种运算,这种运算限定从某些整数出发,反复迭代后结果必然落入一个点或若干点的情况叫数字黑洞。黑洞原是天文学中的概念,表示这样一种天体:引力场是如此之强,就连光也不能逃脱出来。黑洞数又称陷阱数,类具有奇特转换特性整数,任何数字不全相同的整数,经有限重排求差操作,总会得某或些数,这些数即黑洞数重排求差操作即把组成该数数字重排得大数减去重排得小数。

⑷ 用c++编程求黑洞运算

123数字黑洞
黑洞原是天文学中的概念,表示这样一种天体:它的引力场是如此之强,就连光也不能逃脱出来。数学中借用这个词,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点。数字黑洞运算简单,结论明了,易于理解,故人们乐于研究。但有些证明却不那么容易。
任取一个数,相继依次写下它所含的偶数的个数,奇数的个数与这两个数字的和,将得到一个正整数。对这个新的数再把它的偶数个数和奇数个数与其颂启凯和拼成另外一个正整数,如此进行,最后必然停留在数123。
例:所给数字 1479
第一次计算结果 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的规律。我发现无论是三位、还是四位、五位。都或多或少有自己的规律。个人认为规律的根本原因在于数字的重新排列,正是这种正反序列相减,再加上十进制的原则,让它变得有规律。

⑸ c语言 黑洞数

#include<stdio.h>

int兆岩main(void)

{

intnumber,x,y,a,b,c,t,i,max,min,mid;

scanf("%d",&备歼number);i=1;

while(number!=495){

a=number/100;

b=number%100/10;

c=number%10;

mid=a+b+c;

max=a>b?a:b;max=max>c?max:c;

min=a>仿猜冲b?b:a;min=min>c?c:min;

mid=mid-min-max;

x=max*100+mid*10+min;

y=min*100+mid*10+max;

/*---------*/

number=x-y;

printf("%d:%d-%d=%d ",i,x,y,number);

i++;

}

return0;

}

阅读全文

与编程黑洞陷阱相关的资料

热点内容
手机里的文件夹怎么拉出来 浏览:280
饥荒怎么输入ip进服务器 浏览:469
美国恐怖三极片 浏览:995
四川虚拟主机云服务器 浏览:780
母乳喂养真人版电影 浏览:396
免费看片链接 浏览:492
编程将中断类型号 浏览:597
数字编程学院 浏览:95
程序员不时尚 浏览:746
不付费看网站 浏览:230
《代人受过》训诫文 浏览:258
1n.d5h49m6. 浏览:687
linuxweb目录权限 浏览:945
WWW 5a5e 浏览:544
id3v2java 浏览:222
怎么打开mysql命令行 浏览:522
linux文件星号 浏览:632
小城与小妈去北京旅游叫什么小说 浏览:230
pdf阅读器推荐 浏览:81
能免费看英语电影的软件 浏览:126