首页 > 解决方案 > 我的 for 循环似乎没有增加。它卡在 2 上(项目 euler 14)

问题描述

我正在研究 euler #14 项目:

问题:

为正整数集定义了以下迭代序列:

n → n/2(n 为偶数) n → 3n + 1(n 为奇数)

使用上面的规则并从 13 开始,我们生成以下序列:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 可以看出,这个序列(从 13 开始,到 1 结束)包含 10 个项。尽管尚未证明(科拉茨问题),但人们认为所有起始数字都以 1 结束。

哪个起始数字(低于 100 万)产生最长的链?

注意:一旦链启动,条款允许超过一百万。

问题:

当我运行此代码时,第一个 for 循环按预期运行。但是随后变量num似乎没有在 for 循环中增加并保持在 2 (甚至不在我开始时给出的 num 的参数中),给出输出:

2
0

1
1

一遍又一遍地重复。不知道为什么会发生这种情况,并且在网上找不到任何东西。

代码:

#include <stdio.h>

int main() {
    int maxcount = 0;
    for (int num = 5; num < 2000000; num++) {
        printf("%d\n0\n\n", num);
        int count = 0;
        while (num >= 1) {
            count++;
            if (num == 2) {
                num = 1;
                printf("1\n%d\n\n", count);
            }
            if (num > 1) {
                if (num % 2 == 0) {
                    num = num / 2;
                    printf("%d\n%d\n\n", num, count);
                }
                else {
                    num = (3 * num) + 1;
                    printf("%d\n%d\n\n", num, count);
                }
            }
            if (num == 1) {
                break;
            }
        }
        if (count > maxcount) {
            maxcount = count;
        }
    }
    printf("%d", maxcount);
    return 0;
}

标签: cdebugging

解决方案


在 while 循环中,您更改循环变量 ( num) 的值。

您从 开始num = 5,然后内部 while 循环遵循 Collat​​z 的规则并到达 1,此时 while 循环结束。

然后 for 循环结束,并num递增到 2 num++,循环的下一次迭代开始。

在第二次迭代中,while 循环立即看到num == 2,因此它设置num = 1,并且 while 循环结束。然后 for 循环结束,递增num到 2,循环永远继续。

正如其他人所说,您只需要单独保留循环变量并在内部循环中使用不同的变量。


推荐阅读