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