c语言与角谷猜想

c语言与角谷猜想,第1张

#include<stdio.h>

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即为要求的下一个满足条件的数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12419029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存