挑战世界数学难题,也许是很多人想也不敢想的事情。我认为,即使失败了,也没有损失什么,于是乎鼓足勇气,迎难而上。
大概因为无聊,在4月10日那天,上网查找信息的时候,看到了科拉茨猜想。而我最喜欢的是电脑和理科,很自然地想到把编程和数学联系起来。
一、 C程序:
1、简单语句
main( )
{
int m,n,p;
scanf(“%d”,&m);
if(m<=0) printf(“It is an error.”);/*异常处理*/
else
{
for(p=m,n=1;p!=1;n++)
{
if(p%2==0) p=p/2;
else p=3*p+1;
}
printf(“%d”,n);
}
}
/* 无法执行4,2,1死循环,故p==1时结束*/
2、函数调用
#include<stdio.h>
int x;
void CollatzGuess(x)/*科拉茨猜想*/
{
for(size_t i=0;i<100;i++)
{
static int p=1;
while(x%2==0)/*偶数*/
{
x=x/2;
printf(“第%d次运算,结果是: %d\n”,p,x);
}
while(x%2==1)/*奇数*/
{
x=3*x+1;
printf(“第%d次运算,结果是: %d\n”,p,x);
}
if(x==1)
{
break;
}
return;
}
}
int main( )
{
printf(“请输入一个正整数: ”);
scanf_s(“%d”,&x);/*scanf()不会检查输入边界,可能造成数据溢出。scanf_s()会进行边界检查。此处没有注明整型x的大小,用scanf可能合理些。*/
CollatzGuess(x);/*调用函数*/
return 0;
}
二、数学证明:
设N、M、x、y为正整数,n、m、k为自然数,R、r为正偶数,K、S、Z为正奇数,S、Z属于K.函数Ψ(N)=F(R)Uf(K),F(R)=R÷2,f(K)=3K+1,则ψ(N)=Ψ(M)UΨ(4).
证明:N=R∪K
R=2^x·S∪2^y
S=1,R={2^n},则Ψ(2^n)=Ψ(4)
S≠1,Ψ(N)=Ψ((2^x·S)∪K)=F(2^x·S)∪f(K)=S∪f(K)=F(3S+1)∪f(K)。
假定f(K)=3K+1不变,F(2^x·S)在不断执行后最终化为S,代入f(K)=3K+1变为偶数,再变为F(3S+1),无论中间是出现奇数或偶数,当继续执行下去。
具体思路——前面有多少函数值并不是重点,最后出现4或F(4),也许猜想一定成立了。 即便会产生漏洞或重复,也无关紧要。
(此处省略,有空补上)
多年不写代码了,不足之处,恳请各位网友批评指正,谢谢!