3n+1问题

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
}


 

你可能感兴趣的:(算法,input,output)