3n+1问题
3n+1问题是一个简单有趣而又没有解决的数学问题。这个问题是由L. Collatz在1937年提出的。克拉兹问题(Collatz problem)也被叫做hailstone问题、3n+1问题、Hasse算法问题、Kakutani算法问题、Thwaites猜想或者Ulam问题。
问题如下:
(1)输入一个正整数n;
(2)如果n=1则结束;
(3)如果n是奇数,则n变为3n+1,否则n变为n/2;
(4)转入第(2)步。
克拉兹问题的特殊之处在于:尽管很容易将这个问题讲清楚,但直到今天仍不能保证这个问题的算法对所有可能的输入都有效——即至今没有人证明对所有的正整数该过程都终止。
考虑一下数列的生成办法.由n开始. 如果 n是偶数除以2. 如果是奇数, 除以3加1. 这样产生一个新的n, 长此以往,直到n = 1. 例如 n = 22:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
历史证明:0~1000 000无所例外
求这样的数列的长度.例如对于22的数的长度是16。
程序要求:
输入m,n求[m,n]之间的所有数中的最长的长度输出
特别要求:时间短
Sample Input
1 10
100 200
201 210
900 1000
Sample Output
1 10 20
100 200 125
201 210 89
900 1000 174
源代码如下:
#include "stdio.h"
void main(){
int i,j,k=1,n,flag=1,t,m=1,p;
while (flag) {
printf("请输入两个数/n");
scanf("%d %d",&i,&j);
for (t=i;t<=j;t++) {
n=t;
k=1;
while (n!=1) {
if (n%2==0) {
n=n/2;
k=k+1;
}//if
else{
n=n*3+1;
k=k+1;
}//else
}//while
if (k>m) m=k;
}//for
printf("%d %d %d /n",i,j,m);
printf("是否继续运行程序(1运行*0退出)/n");
scanf("%d",&p);
switch(p) {
case 1:flag=1;
break;
case 0:flag=0;
default:flag=0;
}
m=1;
}//while
}