3n+1问题 用c语言实现

Consider the following algorithm to generate a sequence of numbers.Start with an integer n.If n is even, divide by 2.If n is odd, multiply by 3 and add 1.Repeat this process with the new value of n, terminating when n = 1. For example,the following sequence of numbers will be generated for n = 22:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
It is conjectured (but not yet proven)that this algorithm will terminate at n = 1for every integer n.Still, the conjectureholds for all integers up to at least 1, 000, 000.

For an input n, the cycle-length of n isthe number of numbers generated up to andincluding the 1.In the example above, the cycle length of 22 is 16.Given any two numbers i and j, you are to determine the maximum cyclelength over all numbers between i and j, including both endpoints.

Input

The input will consist of a series of pairs of integers i and j, one pair ofintegers per line. All integers will be less than 1,000,000 and greaterthan 0.

Output

For each pair of input integers i and j, output i, j in thesame order in which they appeared in the input and thenthe maximum cycle length for integers between and includingi and j.These three numbers should be separated by one space, with all three numbers on oneline and with one line of output for each line of input.

Sample Input

1 10
100 200
201 210
900 1000

Sample Output

1 10 20
100 200 125
201 210 89
900 1000 174
// [问题描述]
// 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,把它乘 3 加
// 1。用新得到的值重复上述步骤,直到 n = 1 时停止。例如,n = 22 时该算法生成的序列是:
//
// 22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
//
// 人们猜想(没有得到证明)对于任意整数 n,该算法总能终止于 n = 1。这个猜想对于至少 1 000 000
// 内的整数都是正确的。
//
// 对于给定的 n,该序列的元素(包括 1)个数被称为 n 的循环节长度。在上述例子中,22 的循环节长度
// 为 16。输入两个数 i 和 j,你的任务是计算 i 到 j(包含 i 和 j)之间的整数中,循环节长度的最大
// 值。
//
// [输入]
// 输入每行包含两个整数 i 和 j。所有整数大于 0,小于 1 000 000。
//
// [输出]
// 对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。这三
// 个整数应该用单个空格隔开,且在同一行输出。对于读入的每一组数据,在输出中应位于单独的一行。
//
// [样例输入]
// 1 10
// 100 200
// 201 210
// 900 1000
//
// [样例输出]
// 1 10 20
// 100 200 125
// 201 210 89
// 900 1000 174

//

我一开始在programming Challenges这个网站上提交总是报错,我的正确解法如下:

#include <stdio.h>

#define MAX 200000000

int cache[MAX];

int findOneDataLength(long long data) {
    if (data == 1) {
        return 1;
    }
    if (data & 1) {
        data += (data << 1) + 1;
    } else {
        data >>= 1;
    }
    if (data < MAX) {
        if (cache[data]) {
            return cache[data];
        }
        cache[data] = findOneDataLength(data) + 1;
        return cache[data];
    } else {
        return findOneDataLength(data) + 1;
    }

}

int find3nplus1MaxLength(int data1, int data2) {
    int maxLength = -1;
    for (int j = data1; j <= data2; ++j) {
        int data = findOneDataLength(j);
        if (maxLength < data) {
            maxLength = data;
        }
    }
    return maxLength;
}

int main() {
    int data1, data2;
    while (scanf("%d %d", &data1, &data2) != EOF) {
        int temp1 = data1;
        int temp2 = data2;
        if (data1 > data2) {
            data1 = data1 ^ data2;
            data2 = data1 ^ data2;
            data1 = data1 ^ data2;

        }
        int length = find3nplus1MaxLength(data1, data2);
        printf("%d %d %d\n", temp1, temp2, length);
    }
    return 0;


}
总结:

  1.在while循环的时候,我一开始的写法是 while(1),导致Time limit exceeded;后来判断scanf函数的返回值,就可以了

   2.如果输入的是(10,1),(20,1),这种第一个输入的数据比第二个大,也会导致wrong answer,需要调换两个数据的位置

  3.如果不使用缓存也会导致 Time limit exceeded


阅读更多
个人分类: 编程挑战 算法
想对作者说点什么? 我来说一句

3n+1问题 C语言实现

2011年01月19日 1KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭