1976年的一天,《华盛顿邮报》于头版头条刊登了一条数学新闻,文中叙述了这样一则故事:70年代中期,美国个所名牌大学校园内,人们都像发疯一般,日以继夜废寝忘食地玩弄一种数学游戏,这个游戏十分简单,任意写出一个(非零)自然数N,并且按照以下规律进行变换:
- 如果是个奇数,则下一步变成 3N+1
- 如果是个偶数,则下一步变成 N/2
一时间学生、教师、研究员、教授,甚至是一等一的数学大拿、天才都纷纷加入这个看似简单的数学游戏,人们取了各种各样的数字N去检验这个算法,最终都无一例外地坠入自然数序列4-2-1,于是就自然萌生出这样的猜想:对于任意非零自然数N,经上述变换最终都将落入4-2-1序列的宿命。这就是著名的角谷猜想,或称冰雹猜想。
冰雹猜想最大的魅力,在于其不可预知性,数字N的转化过程变幻莫测,有些平缓温和,有些剧烈沉浮,但却都无一例外地会坠入4-2-1的谷底,这好比是一个数学黑洞,将所有的自然数牢牢吸住。有人把冰雹路径比喻一个参天大树,下面的树根是连理枝4-2-1,而上面的枝枝叶叶则构成了一个奥妙的通路,把一切(非零)自然数统统都覆盖了,这个小学生都看得懂的问题,迄今为止却没有任何数学手段和超级计算机可以证明。
冰雹猜想跟蝴蝶效应恰好相悖,蝴蝶效应蕴含的原理是:初始值的极小误差,会造成结果的巨大不同,而冰雹猜想恰好相反:无论刚开始存在多大的误差,最后都会自行修复,直到坠入谷底。
C语言编程实现:找出程序所能表达的最大整数的范围内,变换路径最长的纪录保持者。
#include<stdio.h>
#include<stdint.h>
#include<math.h>
/*
功 能:对输入的参数进行冰雹猜想变换,得到1时返回已经变换的次数,
参 数:num 输入一个非零自然数
返回值: 变换得到1时经过的变换次数
*/
long double bingbao(long double num)
{
long double count=0;
while(1)
{
if(fmodl(num,2)==1)//如果是奇数
{
num = 3*num+1;
count++;
}
else if(fmodl(num,2)==0)//如果是偶数
{
num = num/2;
count++;
}
//printf("%Lg\n",num);
if(num == 1)
break;
}
return count;
}
int main()
{
long double num,num_find,count_new=0,count_old=0,len_1=0,len_2=0;
printf("我可以找出你给定范围内冰雹猜想变换次数最多的自然数\n");
printf("请输入一个范围:\n");
printf("起始数:");
scanf("%Lf",&len_1);
printf("末尾数:");
scanf("%Lf",&len_2);
if(len_1>=len_2)
{
printf("输入错误:起始数应该小于末尾数!\n");
return 1;
}
num = len_1;
while(num<len_2)
{
count_new = bingbao(num);
if(count_new>count_old)
{
count_old = count_new;
num_find = num;
}
num++;
}
printf("在你给定的%Lg----%Lg范围内\n",len_1,len_2);
printf("变换次数最多的是自然数是%Lg\n",num_find);
printf("它经过%Lg次变换后开始得到1\n",count_old);
printf("变换路径如下:\n");
while(1)
{
printf("%Lg-->",num_find);
if(fmodl(num_find,2)==1)//如果是奇数
{
num_find = 3*num_find+1;
}
else if(fmodl(num_find,2)==0)//如果是偶数
{
num_find = num_find/2;
}
if(num_find == 1)
break;
}
printf("1\n");
return 0;
}运行结果:linux下运行结果

















