图片是截取的OJ上的 就不复制文字啦;
二话不说,一贯风格先上代码
#include <stdio.h>
#include <string.h>
#define maxn 2000000
int s[maxn]={0};
int main()
{
unsigned long long int a,b,j,i,n,max,c,m,x;
while(scanf("%llu %llu",&a,&b)!=EOF)
{
int k=0;
printf("%llu %llu",a,b);
if(a>b) {m=a;a=b;b=m;}
for(j=a,k=0;j<=b;j++,k++)
{
x=j;
for(i=1;x!=1;i++)
{
if(x%2==0) x=x/2;
else x=x*3+1;
}
s[k]=i;
}
max=0;
for(m=0;m<=b-a;m++)
if(s[m]>max) max=s[m];
printf(" %d\n",max);
}
return 0;
}
这个代码还是能看出来我的一些毛病的,就比如说我特别害怕爆栈,所以数据类型开的比较大,希望大家能理解;
让我们来解读题目意思:
求每个数的最大周期长度,这个周期长度的定义在description里面很明确就是这个数从一开始到变换到1的次数,一直循环直到这个数等于1。
for(i=1;x!=1;i++)
{
if(x%2==0) x=x/2;
else x=x*3+1;
}
循环这样写就可以了。但是数的周期长度要保存下来这里我就设置了一个s[ ]数组,用来存储两个数之间的周期长度。
输出要求是最大周期长度,所以我们用丁丁老师常说的打擂台的方法来解决这类问题:定义max=0,将数组中的元素一一作比,大数传给max,最后输出max就好啦。
这道题在VJ上UVA也有这道题 大概是最简单的了,大家可以去试一试。
还有一种方法比较暴力但在处理多数据的情况下时间上会得到优化,但在处理大类型数据的情况下不知道会不会爆栈,反正在山东科技大学的OJ上是AC了的:
上代码:
#include <stdio.h>
#include <string.h>
#define maxn 2000000
int s[maxn]={0};
int main()
{
unsigned long long int a,b,j,i,n,max,c,m;
for(j=1;j<=1000000;j++)
{
a=j;
for(i=1;a!=1;i++)
{
if(a<j) {i+=s[a]-1;break;}
else if(a%2==0) a=a/2;
else a=a*3+1;
}
s[j]=i;
}
while(scanf("%llu %llu",&a,&b)!=EOF)
{
printf("%llu %llu",a,b);
if(a>b) {m=a;a=b;b=m;}
max=0;
for(;a<=b;a++)
{
if(s[a]>max) max=s[a];
}
printf(" %d\n",max);
}
return 0;
}
这个代码的意思很简单,就是把1到1000000的所有数的周期长度都算出来保存着,然后在比较,可以说是相当暴力了。
但是在SDUST OJ上AC了却没有超时,这是我始料未及的。
希望大家多多关注,小鑫会很努力地写博客的,我在这给各位大爷跪下了 噗通~~~~~~!