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


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

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

杀死人不偿命(3n+1)的猜想(c语言)

对任何一个自然数n,如果它是偶数,那么把它砍掉一半; 如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。 卡拉兹在1950年的世界数学家大会上公布了这个猜想...
  • LZXloveGYD
  • LZXloveGYD
  • 2017年04月29日 11:25
  • 622

[sicily]1293. 3n+1数链问题

1293. 3n+1数链问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 在计算机科学上,有很多类问题是...
  • luohuang0423
  • luohuang0423
  • 2015年10月19日 20:01
  • 478

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

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

【C++】浙大PAT (Basic Level)1005. 继续(3n+1)猜想 (25)

#include #include #include using namespace std; int listIt(int n){ if(n%2==0){ ...
  • artemisrj
  • artemisrj
  • 2014年01月13日 14:16
  • 1025

HDOJ, 杭电1032, The 3n+1 problem. POJ, 北大OJ,1207....数学题。。又一发

一个英文题。。。 Uva的第一道题目。HDOJ的1032题,POJ的1207题、、、 坑爹的POJ居然不识别 _int64,不过还好,他没要求大于int型的数字。。。所以,用int,AC险过了。。。 ...
  • hu1020935219
  • hu1020935219
  • 2013年09月21日 13:58
  • 1460

蓝桥杯-3n+1问题(例题)

“3n+1”问题:        对于任意大于1的自然数n,若该数为偶数则将其变为原来的一半,若为奇数则将其变为3n+1。反复进行上述过程,直到结果为1时停止。这就是著名的“3n+1”问题。要求输入...
  • cr496352127
  • cr496352127
  • 2016年11月01日 12:33
  • 599

1005.继续(3n+1)猜想(c语言)

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

c语言-报数问题(链表)

13个人围成一圈,从第一个人开始顺序报号 1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。 这是上个学期的作业,现在贴上来,可能对最近学c++和数据...
  • u013165626
  • u013165626
  • 2014年03月11日 22:41
  • 980

PAT乙级1001. 害死人不偿命的(3n+1)猜想 (15) C++

这道题目并不是很难,解题思路如下: 首先根据计算方法,把每一次的处理分为两种情况(奇数、偶数),然后因为要得出次数,所以很自然需要计数器和循环。临界条件比较清晰,题目中说:简单地数一下,需要多少步才...
  • hengbao4
  • hengbao4
  • 2016年07月21日 18:08
  • 972
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3n+1问题 用c语言实现
举报原因:
原因补充:

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