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

例:3n+1问题

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

输入n,输出变换的次数。n不大于10的九次幂。

样例输入:3

样例输出:7

解:直接模拟过程即可,下面是代码:

#include
int main()
{
    int n, count = 0;
    scanf("%d", &n);
    while(n > 1)
    {
        if(n%2 == 1) n = n * 3 + 1;
        else n /= 2;
        count++;
    }
    printf("%d\n", count);
    return 0;
}
验证上面样例,发现正确:


那如果输入的是999999999呢?结果:


居然是1!原来是因为定义的n为int型整数,它的最大值为2147483647,也就是说,在程序刚刚执行了一次“n = 3*n+1”时,就已经溢出了,所以直接输出了1~所以只好用64位长整型了,程序如下:

#include
int main()
{
    int count = 0;
    long long n;//定义64位长整型数
    scanf("%lld", &n);//此处"%lld"也可写成"%I64d"
    while(n > 1)
    {
        if(n%2 == 1) n = n * 3 + 1;
        else n /= 2;
        count++;
    }
    printf("%d\n", count);
    return 0;
}
下面看运行结果:


程序正常运行~

总结:在编写程序时,要注意定义的变量溢出的问题,否则很可能纠结于程序的逻辑正确与否上却发现怎么也找不出Bug,纠结啊...

你可能感兴趣的:(狂奔のC/C++,C/C++每日小练)