UVA / 山东科技大学OJ 3n+1problem

图片是截取的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了却没有超时,这是我始料未及的。

希望大家多多关注,小鑫会很努力地写博客的,我在这给各位大爷跪下了     噗通~~~~~~!

猜你喜欢

转载自blog.csdn.net/weixin_43820496/article/details/85040295
今日推荐