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的最大值。这种方法就是咱们平时所说的“用空间换取时间”吧!数组