⽤C语⾔验证“6174⿊洞之谜”!万物始于C,编程世界的⿊洞!
今⼉跟⼤伙分享⼀个数字之谜——6174之谜,看看我们是怎么⽤C语⾔验证它的。
先简单介绍⼀些跟我们这个题⽬相关的背景知识。
⿊洞,我想不少⼈都听说过,意思就是宇宙中的⿊洞可以将任何物质,以及运⾏速度最快的光牢牢吸住,不使它们逃脱。
数学⿊洞也是如此,也就是对于规定的数字来说,⽆论怎样设值,在规定的处理法则下,最终都将得到固定的⼀个值,再也跳不出去了,我们今天所说的“6174⿊洞”就是这个意思。1955年,印度数学家卡普耶卡(D.R.Kaprekar)研究了对四位数的⼀种变换:任给出四位数k0,⽤它的四个数字由⼤到⼩重新排列成⼀个四位数m,再减去它的反序数rev(m),得出数
k1=m-rev(m)。
然后,继续对k1重复上述变换,得数k2。如此进⾏下去,卡普耶卡发现,⽆论k0是多⼤的四位数,只要四个数字不全相同,最多进⾏7次上述变换,就会出现四位数6174。
这就是数学史上著名的“6174猜想”,也称为6174数字⿊洞”,以上计算过程称为卡普雷卡尔运算,这个现象称归敛。
当然,这是4个数的情况,当数字个数为3的时候,循环值为495,也是著名的数学⿊洞数字。今天我们只要想跟⼤家说的是如何⽤C语⾔验证6174⿊洞。
那这个问题实际上抽象为:任意选⼀个四位数(数字不能全相同),把所有数字从⼤到⼩排列,再把所有数字从⼩到⼤排列,⽤前者减去后者得到⼀个新的数。重复对新得到的数进⾏上述操作,7步以内必然会得到6174。
请⽤C语⾔进⾏验证,并求出经过⼏次变换得到6174。
其实与本题类似的情况在浙⼤PAT中曾经出现过,解决总体思路⽐较简单,主要涉及排序和数字放⼊数组进⾏计算的相关情况,代码我们下⾯给出⼀种供⼤家参考,⾮唯⼀解,各位有好的⽅法可以留⾔⼀起交流。
#include <stdio.h>
int* sort(int number[],int len) //⼤到⼩的排序
{
int a =0;
for(int i=0; i<len; ++i)
{
for(int j=i+1;j<len;++j)
{
if(number[i] <number[j])
网络编程之delphi
{
a = number[i];
number[i] = number[j];
number[j] = a;
}
}
}
return number;
}
如果你想深度学习C语⾔以及⾼级编程——
涉及到:C语⾔、C++、windows编程、⽹络编程、QT界⾯开发、Linux编程、游戏编程、⿊客等等......
程序员编程⼊门资料:
程序员推荐学习书籍:
⼀个活跃、⾼逼格、⾼层次的程序员编程学习殿堂;编程⼊门只是顺带,思维的提⾼才有价值!
int convert(int number[],int ans)//每次变换得到的数字
{
int *p = NULL;
int m=0;
number[0] = ans/1000;  //把这个数放⼊数组
number[1] = ans%1000/100;
number[2] = ans%100/10;
number[3] = ans%10;
p = sort(number,4);
m=(*p*1000+*(p+1)*100+*(p+2)*10+*(p+3))- ( *(p+3)*1000+*(p+2)*100+*(p+1)*10+*p); return m;
}
int main(void)
{
int number[4] = {0};
int *p = NULL;
int n = 0;
int ans = 0;
int count = 0;
printf("请输⼊⼀个互不相同的四位数:");
scanf("%d",&n);
printf("%d-",n);
ans = n;
while(ans!=6174)
{
ans = convert(number,ans);
printf("%d-",ans);
++count;
}
if(6174==ans)
printf("%d\n",6174);
printf("%d",count);
return0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。