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

原创 2017年01月23日 11:08:34

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


相关文章推荐

1.6.1 3n+1问题 The 3n+1 problem

The 3n + 1 problem   Consider the following algorithm to generate a sequ...
  • CHCXCHC
  • CHCXCHC
  • 2014年01月22日 18:45
  • 611

C语言每日小练(一)——3n+1问题

例:3n+1问题 对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。经过若干次变换,一定会使n变为1。例如3-》10-》5-》16-》8-》4-》2-》1。 输入n,输出...

PAT Basic 1005. 继续(3n+1)猜想 (25)(C语言实现)

题目 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证...

PAT (Basic Level) Practise (中文)1005. 继续(3n+1)猜想 (25) C语言

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B ...

0-1背包和背包问题(C语言实现)——贪心算法应用(3)

问题描述:           给定n种物品和一个背包。物品i的重量为w[i],其价值为v[i],背包的容量为c。应如何选择装入  背包的物品,使得装入背包中的物品的总价值最大。每种物品最多装入一次...

一个中兴的面试题,输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解(c语言递归函数分解法)

原题目:输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解 c语言解法分析:            先判定n和m的大小,如果m小于n,则只需从1...

C语言 N阶汉诺塔问题的递归实现

//递归实现模拟汉诺塔 //作者:nuaazdh //时间:2011年12月9日 08:22:27 #include #define OK 1 #define ERROR 0 #de...
  • nuaazdh
  • nuaazdh
  • 2011年12月09日 11:06
  • 6165

3n+1 问题 java 实现

uva number: 100 评判结果: /* * To change this license header, choose License Headers in Project Prope...

编程挑战——3n+1问题(不完全实现)改一

题目详情 对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3n+1问题 用c语言实现
举报原因:
原因补充:

(最多只允许输入30个字)