陷入循环Collat​​z猜想在C中尝试

时间:2016-09-30 17:12:52

标签: c loops if-statement ansi collatz

我的代码中存在一个逻辑缺陷,我似乎无法通过2 ^ 31 - 1作为输入。这是我的代码片段。

#include <stdio.h>
int main() {
long input = 0;
long temp = 0;
int count = 0;
printf("Enter a positive integer ( or 0 to quit): ");
scanf("%ld", &input);
if(input == 0)
{
    printf("Quit.");
}
else
{
    temp = input;
    while (temp != 1)
    {
        if(temp %2 ==0)
        {
            temp = temp/2;
            count++;


        } else
        {
            temp = 3*temp + 1;
            count++;
        }

    }
return 0;
}

我尝试将输入的大小更改为long =&gt;调试它后,它仍然卡在这个区域内。请提供一些反馈谢谢!

2 个答案:

答案 0 :(得分:0)

假设您的系统有64位长,那么将其更改为使用unsigned long,包括scanf(),似乎可以正常工作:

#include <stdio.h>
#include <assert.h>

int main() {
    unsigned long input;
    assert(sizeof(input) * 8 >= 64);

    while (1) {
        printf("Enter a positive integer (or 0 to quit): ");
        (void) scanf("%lu", &input);

        if (input == 0) {
            break;
        }

        unsigned int count = 0;

        while (input != 1) {
            if (input % 2 == 0) {
                input /= 2;
            } else {
                input = 3 * input + 1;
            }
            count++;
        }

        printf("%d\n", count);
    }

    printf("Quit.\n");

    return 0;
}

<强> USAGE

> ./a.out
Enter a positive integer (or 0 to quit): 2147483647
450
Enter a positive integer (or 0 to quit): 0
Quit.
>

否则,找一些其他64位类型(long long?)来使用。 Python工作,因为它有无限大的整数。

答案 1 :(得分:0)

long int不一定必须超过32位。为确保您使用的是64位整数,最好使用int64_t中的inttypes.h类型,并在调用中使用PRId64宏而不是ld scanf()

但是,在任何普通的桌面系统上,你应该至少获得一个32位的int。但问题出在这行代码中:

temp = 3 * temp + 1;

如果输入是2 ^ 31-1,那么这将溢出32位int。