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的最大值。ios

#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的最大值。這種方法就是咱們平時所說的「用空間換取時間」吧!數組

相關文章
相關標籤/搜索