fopen失败导致程序直接结束_6174数字黑洞的程序证明(附源代码)

在小学生的趣味数学的读物中,很容易读到一个有趣的命题:6174数字黑洞。这个数字黑洞的意思是:

        一个四位数,只要四个数字不是全都一样(不是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
  1. 这是一个主体是循环语句的程序,依次从1000-9998就好。
  2. 中间我们需要一个记数器,每次掉进黑洞,我们要记一次,这样最后掉进的次数如果是8991次(除去了1111,2222,3333.....)这些,是8991个四位数。
  3. 每次执行操作时还要有一个步数计数器,连记录如果掉进黑洞是几次操作后掉进黑洞以验证命题中的是不是都是7次或以内掉进。
  4. 如果可以,把所有的中间步骤都写进一个文本文件,这样不但验证了命题,所有的四位数都是几步如何掉进黑洞的日后都非常方便直接查找获得。
以上是总体框架算法,技术层面上考虑这么几个问题差不多就可以了:
  • 排除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文件,打开是这样,太多了,稍微贴几张是这样:

84af117d29ee97ec17d26f95d3312e0f.png

1efa4c90b316a39df66ac7e79c3442bb.png

61745bedffb5f0236294fe5a5fc99f4a.png

最后也计数到8991次掉进黑洞,并且最多是七步。那么这个6174黑洞是对的,没有反例。以后可以放心说了。

好了,留思考题的习惯又犯了。

三位数有黑洞吗?是几?怎么证明?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值