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