今日题目分享------>>角谷猜想,又叫冰雹猜想
故事分享:1976年的一天,《华盛顿邮报》于头版头条刊登了一条数学新闻,文中叙述了这样一则故事:70年代中期,美国个所名牌大学校园内,人们都像发疯一般,日以继夜废寝忘食地玩弄一种数学游戏,这个游戏十分简单,任意写出一个(非零)自然数N,并且按照以下规律进行变换:
- 如果是个奇数,则下一步变成 3N+1
- 如果是个偶数,则下一步变成 N/2
一时间学生、教师、研究员、教授,甚至是一等一的数学大拿、天才都纷纷加入这个看似简单的数学游戏,人们取了各种各样的数字N去检验这个算法,最终都无一例外地坠入自然数序列4-2-1,于是就自然萌生出这样的猜想:对于任意非零自然数N,经上述变换最终都将落入4-2-1序列的宿命。这就是著名的角谷猜想,或称冰雹猜想。
当时看到这里我半信半疑,莫非真的有这么神奇吗???真的随便输入任意的自然数,经过这个公式计算到最后的序列都是4 2 1吗? 带着这个疑问,我们来用代码实现,亲自验证一下!!!!
程序代码:
#include<stdio.h>
#include<stdlib.h>
//去负数绝对值的函数
int my_abs(int x)
{
int mask = x >> (sizeof(int) * 8 - 1);
return (x + mask) ^ mask;
}
void ice_(int*num)
{
if(*num>0)
{
while(*num != 1)
{
if(*num%2==0)
{
//输入为偶数
*num=(*num)/2;
printf("%d ", *num);
}
else
{
//为奇数
*num=3*(*num)+1;
printf("%d ", *num);
}
}
}
if(*num<0)
{
*num = my_abs(*num);
// *num=(*num)^(1<<31);
printf("%d\n", *num);
while(*num != 1)
{
if(*num%2==0)
{
//输入位偶数
*num=(*num)/2;
printf("%d ", *num);
}
else
{
//为奇数
*num=3*(*num)+1;
printf("%d ", *num);
}
}
}
}
int main()
{
int N;
printf("请输入一个非零自然数:");
scanf("%d", &N);
ice_(&N);
printf("\n");
return 0;
}
注意:int my_abs(int x)函数是一个 取负数绝对值的函数,使用位运算求绝对值,为了让负数也能实现一样的效果,做了一个小转换,看读者需求,加不加无所谓的,不过既然写了,就简单说一下:
这个示例代码中,我们定义了一个 my_abs() 函数来计算一个整数的绝对值。首先,我们通过右移运算符(>>)将 x 的符号位移到最右侧,得到一个掩码 mask,其值为 0 或 -1。然后,我们将 x 和 mask 相加,得到一个中间值。最后,我们将中间值和掩码 mask 进行异或运算,得到 x 的绝对值。这种方法的优点是它的效率很高,特别是在处理大量数据时。由于它不需要任何条件分支或函数调用,因此它的执行速度非常快。但是,这种方法只适用于计算整数的的绝对值,而且在计算负数的绝对值时需要进行符号位移操作,这会影响代码的可读性和可维护性(转载于C语言中文网的解释,大家感兴趣可以自己查一下哦)
实现效果:
验证效果确实如其所说,随便输入一个非零整数,到最后的运算的序列都会回到4-2-1,是不是感觉有点神奇,我也这么觉得哈哈哈哈!
其实冰雹猜想最大的魅力,在于其不可预知性,数字N的转化过程变幻莫测,有些平缓温和,有些剧烈沉浮,但却都无一例外地会坠入4-2-1的谷底,这好比是一个数学黑洞,将所有的自然数牢牢吸住。有人把冰雹路径比喻一个参天大树,下面的树根是连理枝4-2-1,而上面的枝枝叶叶则构成了一个奥妙的通路,把一切(非零)自然数统统都覆盖了,这个小学生都看得懂的问题,迄今为止却没有任何数学手段和超级计算机可以证明这是为什么!
冰雹猜想跟蝴蝶效应恰好相悖,蝴蝶效应蕴含的原理是:初始值的极小误差,会造成结果的巨大不同,而冰雹猜想恰好相反:无论刚开始存在多大的误差,最后都会自行修复,直到坠入谷底,咱也不知道,但确实很神奇!
好啦!今天的分享就到这里啦!下次再会!谢谢大家的阅读!