题目大意: 按照这种规则来编程。然后中途算出的数的个数成为一个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;
}
posted on 2012-02-13 19:29  cchun  阅读(188)  评论(0编辑  收藏  举报