一个四位数,只要四个数字不是全都一样(不是1111,2222…这样),进行以下操作:把数字从大到小排列成一个四位数,再从小到大排成另一个四位数。用大数减小数,一次操作结束。然后对结果再重复以上操作。最多七步会掉进6174这个黑洞再也出不来。(7641-1467=6174,以后永远是这个表达式了)。
举个例子,随便取一个四位数:7265
第1步:7652-2567=5085
第2步:8550-0558=7992
第3步:9972-2799=7173
第4步:7731-1377=6354
第5步:6543-3456=3087
第6步:8730-0378=8352
第7步:8532-2358=6174
之后都是7641-1467=6174……
再试一些数好像都是这样的。那么问题来了,是所有的四位数都会这样吗?对这个问题的回答,其实没有必要当作是一个数论的证明。因为四位数是有限的。所以如果精力可以的话,把所有的四位数都这么操作一遍,看看结果是不是都这样了。自然能看到是不是有反例了。想到这一层,问题就很简单了。写一个程序遍历一遍,问题就解决了。其中算法是主要考虑的问题是:![aa96c8cba0fb55035f993534f9a4c949.png](https://i-blog.csdnimg.cn/blog_migrate/a7bc687c23f593ffc801863fe5b6ce0e.jpeg)
- 这是一个主体是循环语句的程序,依次从1000-9998就好。
- 中间我们需要一个记数器,每次掉进黑洞,我们要记一次,这样最后掉进的次数如果是8991次(除去了1111,2222,3333.....)这些,是8991个四位数。
- 每次执行操作时还要有一个步数计数器,连记录如果掉进黑洞是几次操作后掉进黑洞以验证命题中的是不是都是7次或以内掉进。
- 如果可以,把所有的中间步骤都写进一个文本文件,这样不但验证了命题,所有的四位数都是几步如何掉进黑洞的日后都非常方便直接查找获得。
- 排除1111,2222,3333.....等等,用循环计数除以1111取余看是否为零应该是最简单易行的。如果是,就排除。
- 提取四位数各个位置的数字,千位数字是除以1000取整,百位数字是原数减去千位数字乘以1000之后再除以100取整,以此类推。
其他一些小技术细节不提了,Matlab原代码如下:
isright=0;
fid=fopen('All6174.txt','w');
for yrfour=1000:9999
if mod(yrfour,1111)==0
fprintf(fid,'\n%d:bypass\n',yrfour);
else
fprintf(fid,'\n%d:\n',yrfour);
for step=0:7
if yrfour==6174
isright=isright+1;
break
end
step=step+1;
a=zeros(1,4);
a(1)=floor(yrfour/1000);
a(2)=floor((yrfour-a(1)*1000)/100);
a(3)=floor((yrfour-a(1)*1000-a(2)*100)/10);
a(4)=mod(yrfour,10);
max4ar=sort(a,'descend');
max4=max4ar(1)*1000+max4ar(2)*100+max4ar(3)*10+max4ar(4);
min4ar=sort(a);
min4=min4ar(1)*1000+min4ar(2)*100+min4ar(3)*10+min4ar(4);
yrfour=max4-min4;
fprintf(fid,'step %d:%d-%d=%d\n',step,max4,min4,yrfour);
end
fprintf(fid,'\n');
end
end
fprintf(fid,'\n共%d次掉进6174黑洞\n',isright);
fclose(fid);
fprintf('\n共%d次掉进6174黑洞\n',isright);
运行得到All6174.txt文件,打开是这样,太多了,稍微贴几张是这样:
最后也计数到8991次掉进黑洞,并且最多是七步。那么这个6174黑洞是对的,没有反例。以后可以放心说了。
好了,留思考题的习惯又犯了。
三位数有黑洞吗?是几?怎么证明?