The 3n+1 problem

    uva online上的第一个题:对一个正整数n(0<n<1000000),做如下处理: 若n=1,退出;若n为奇数,则使n=3n+1;若n为偶数,n=n/2。n从开始输入到变为1的过程中变化值的个数称为n的cycle length,如4的cycle length为3。                     INPUT:输入两个0到1000000之间的整数。                                                                                                           OUTPUT:输出这两个数以及这两个数(包括这两个数)之间的所有数的cycle length的最大值。

#include<iostream>
#include<malloc.h>
using namespace std;
int array[1000000];
char ch;
int main()
{
 long int i,j,ii,jj,k;
 unsigned long   n;
 int max,temp;
 int count;
 array[1]=1;array[2]=2;
 for(k=3;k<1000000;k++)
 {
   n=k;
   count=0;
   while(n!=1) 
   { 
	if(n<k)  {count+=array[n];break;} 
	if (n%2)  {n=3*n+1;count++;}
      else {n=n>>1;count++;}
   }
   array[k]=count;
 }
 while(cin>>i&&i!=EOF)
 {
 cin>>j;
 ii=i,jj=j;
 if(i>j)
 {
   temp=i;
   i=j;
   j=temp;
 }
 max=0;
 for(;i<=j;i++)
 {
 if (max<array[i])   max=array[i];
 }
 cout<<ii<<" "<<jj<<" "<<max<<endl;
 }
 return 0;
}

    这个问题其实很简单,我一开始的做法是对输入的两个数i,j(假设i<j),作从i到j的循环,依次求i,j之间每个数的cycle length,保存其中的最大值,最后输出最大值。但提交上去,返回的信息是运行时间超出了time limmit。后来在网上找到的一种方法,先定义一个大小为1000000的数组array,用来保存每个数的cycle length,然后从1开始求每个数的cycle length,在求后面的数的cycle length的时候,可以利用前面已经求出的cycle length值,从而有效减少了运行时间。最后在输入的两个数之间找到cycle length的最大值。这种方法就是我们平时所说的“用空间换取时间”吧!

你可能感兴趣的:(problem,3n+1)