main()
{int
a,b,count
printf("晌肆请输入a的值,以便检验角谷猜想。\na=")
scanf("%d",&a)
b=a
while
(a!=1)
{if
(a>1&&a%2==0)
{a=a/2
printf
("→%d\n",a)}
else
{a=3*a+1printf("→%d\n",a)}
count++}printf("%d需经过%d步才得到1.",b,count)}
//如宴嫌轿果能够逆推出,比方说,23的下一步是70,那么都有哪些数的下一步是70?如此逆推,就能写者察成一棵"数论树".
#include<stdio.h>main()
{
int n,c=0
printf("输入一个小于等灶派于一万败宽的整数:")
scanf("%d",&n)
if(n>10000&&n<0) printf("输入错误请重新输入!")
while(n!=1)
{
if(n%2==0)
n=n/察辩亮2
else
n=n*3+1
c++
}
printf("%d\n",c)
}
暴力破解法:f[000000001] = 1
f[000199981] = 199981
f[000199982] = 199982
f[000199983] = 199983
f[000199984] = 199984
f[000199985] = 199985
f[000199986] = 199986
f[000199987] = 199987
f[000199988] = 199988
f[000199989] = 199989
f[000199990] = 199990
f[000200000] = 200000
f[000200001] = 200001
f[001599981] = 1599981
f[001599982] = 1599982
可以看出下一个n是199981,满足f(n) = n。
不用程序,手算也可以求解。f(n) = n 表示 y = f(n) 和 y = n 的交点,通过观察 y = f(n) 的变化可以估计交点的肢州范围。f(n) 的一些关键点如下:
f(9) = 1
f(99) = 20
f(999) = 300
f(9999) = 4000
f(99999) = 50000
f(999999) = 600000
这是非常有规律的,同时另外档姿一些观点如下:
f(19) = 12 (f(9)*2 + 1*10 )
f(199) = 140 (f(99)*2 + 1*100)
f(1999) = 1600 (同上)
f(19999)= 18000
f(199999) = 200000
f(1999999) = 2200000
它也是很有规律的,它们分别是 y = f(n) - n 的局部极小值点和极大值点。
由于 f(99999) = 50000 <99999 而 f(199999) = 200000 >199999, 则这区间内必有交点
199991中包含两个行饥绝1,它之前的199981也包含两个1,则当 199981 <= n <199991 时,都有 f(n) = n 成立。199981即为要求的下一个满足条件的数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)