• HDU1032_The 3n+1_数学题


    题目大意: 按照这种规则来编程。然后中途算出的数的个数成为一个cycle-length ,求出i与j之间的最大cycle-length.i与j<1000000. 1.      input n 2.      print n 3.      if n = 1 then STOP 4.           if n is odd then   n <- 3n + 1 5.           else   n <- n / 2 6.      GOTO 2 解题思路: 一开始想的就是一般的写法肯定是超时,本来直接敲是想找出规律来,没想到,真的就是暴力,不超时。。。有一些cycle_len可以达到几百,也就是说运算次数有可能达到1亿,这样都不超?好吧,我都无语了。。。 吐吐槽: 注意是求出i与j之间的,并没有说明i小于j,而且输出说输出的i,j顺序要跟输入一样。 代码:
    #include
    #include
    #include
    #include
    using namespace std;
    
    int f(int a, int sum, vector &vec)
    {
        sum++;
        vec.push_back(a);
        if(a == 1)
        {
            /*cout << vec.size() << ": ";
            sort(vec.begin(), vec.end());
            for(int i = 0; i < vec.size(); i++)
            	cout << vec[i] << " ";
            cout << endl;*/
            return sum;
        }
        else
        {
            if(a % 2)
            {
                f(3 * a + 1, sum, vec);
            }
            else
                f(a / 2, sum, vec);
        }
    }
    
    int main(void)
    {
        int s, e;
        while(scanf("%d %d", &s, &e) == 2)
        {
            bool flag = false;
            if(s > e)
            {
                s = s ^ e;
                e = s ^ e;
                s = s ^ e;
                flag = true;
            }
            int max = 0;
            for(int i = s; i <= e; i++)
            {
                vector vec;
                int temp = f(i, 0, vec);
                if(temp > max)
                {
                    max = temp;
                }
                //cout << endl;
            }
            if(flag)
                printf("%d %d %d\n", e, s, max);
            else
                printf("%d %d %d\n", s, e, max);
        }
        return 0;
    }
    
  • 相关阅读:
    工作中遇到新知识应该怎么办
    Java中的集合
    JSTL学习(二)自定义标签库
    别跟我扯依赖注入
    经典算法的分析
    Debian
    C 底层细节【转】
    C文件操作 【转】
    利用strstr和sscanf解析GPS信息
    算法学习建议 ACM()转
  • 原文地址:https://www.cnblogs.com/cchun/p/2520223.html
Copyright © 2020-2023  润新知