对于循环不递增或循环不失败测试

For loop not incrementing or while loop not failing test

本文关键字:循环 不失败 测试 于循环      更新时间:2023-10-16

我有这部分代码,它应该找到给定范围内所有整数的 Collatz 序列,由用户输入定义。问题在于,在for循环中,current_number永远不会递增,或者在内部while循环中,current_number != 1永远不会失败。我错过了什么?

while (lower != 0 && upper != 0) {
    cout << "Lower bound (integer): ";
    cin >> lower;
    cout << "Upper bound (integer): ";
    cin >> upper;
    if (lower == 0 || upper == 0)
        return 0;
    for (current_number = lower; current_number <= upper;
        ++current_number) {
            //cout << current_number << endl;
            counter = 0;
            sequence = sequence + to_string(current_number) + ", ";
            while (current_number != 1) {
                if (current_number % 2 == 0) {
                    current_number = current_number / 2;
                    sequence = sequence + to_string(current_number) + ", ";
                }
                else {
                    current_number = current_number * 3 + 1;
                    sequence = sequence + to_string(current_number) + ", ";
                }
                cout << current_number << endl;
                ++counter;
            }
            //if (counter > longest) {
            //  longest = counter;
            //  the_longest_seed = current_number;
            //}
    }
    cout << sequence << endl;
}

>current_number % 2 == 0对所有current_number = 0, 2, 4, 6, ...都是正确的。

发生这种情况时,您将current_number设置为current_number / 2.。因此,当current_number为 2 时,您将它设置为 1,然后递增它 ( ++current_number ),然后它又是 2 ( != 1 ),所以您将进入 while 循环,然后因为2 % 2 = 0您将再次将其设置为 1。等等..:_(

终身提示:调试你的代码,它会节省时间、精力,有时还可以节省金钱。

除了另一个错误之外,您还使用 current_number 遍历输入范围,并对其进行更改以输出 Collatz 序列。 您应该更改 current_number 的副本。

关于永不失败的循环。如果 current_number != 1 并且它不是 2(如果是,另一个人已经回答了),它会进入 while 循环并且永远不会结束,因为......

假设它是 3:

3 % 2 != 0,所以它变成 10,

10 % 2 == 0,所以它变成 5,

5 %2 != 0,所以它变成 16

永远不会失败。