1976年的一天,《华盛顿邮报》于头版头条刊登了一条数学新闻,文中叙述了这样一则故事:70年代中期,美国个所名牌大学校园内,人们都像发疯一般,日以继夜废寝忘食地玩弄一种数学游戏,这个游戏十分简单,任意写出一个(非零)自然数N,并且按照以下规律进行变换:

  1. 如果是个奇数,则下一步变成 3N+1
  2. 如果是个偶数,则下一步变成 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下运行结果

C语言编写冰雹猜想(角谷猜想)-编程知识网