迭代循环无限循环用于数学目的

时间:2014-12-24 22:51:50

标签: c++

我正在努力解决数学问题。我声明一个“数字”,如果它是偶数,它被分成2,如果它是奇数,它乘以3和+1。但是,我想使用迭代,但由于某种原因,我的程序无法使用它。这是两个代码,一个是通过声明数字为13,另一个是使用迭代语句。

#include <iostream>

using namespace std;

int main(){
    int sum = 0;
    int number = 13;
    cout << "\nFOR THIS NUMBER : " << number;

    while (number > 1){
        if (number % 2 != 0){
                number = 3 * number + 1;
                cout << "\n" << number;
                sum = sum + 1;
        }
        if (number % 2 == 0){
                number = number / 2;
                cout << "\n" << number;
                sum = sum + 1;
        }
    }

    cout << "\n\nThe sum is : " << sum << "\n";
    return 0;
}

按预期输出40,20,10,5,16,8,4,2,1。

以下是其他代码:

#include <iostream>

using namespace std;

int main(){
    int sum = 0;
    for (int number = 13; number < 14; number = number + 1){    
        cout << "\nFOR THIS NUMBER : " << number;

        while (number > 1){
            if (number % 2 != 0){
                number = 3 * number + 1;
                cout << "\n" << number;
                sum = sum + 1;
            }
            if (number % 2 == 0){
                number = number / 2;
                cout << "\n" << number;
                sum = sum + 1;
            }
        }
        cout << "\n\nThe sum is : " << sum << "\n";
    }
    return 0;
}

这应该输出完全相同的答案,但是当我运行它时,它会变成无限循环。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

我认为核心问题是你使用number作为循环控制变量,但你也在修改循环内部number的方式与控制外部没有任何关系环。这显然是一种容易出错的做法。

我建议你将循环控制与hailstone sequence计算分开。例如:

#include <iostream>
using namespace std;

int main(){
    int sum = 0;
    for (int loop = 13; loop < 14; ++loop){
        int number = loop;
        cout << "\nFOR THIS NUMBER : " << number;

        while (number > 1){
            if (number % 2 != 0){
                number = 3 * number + 1;
            } else {
                number /= 2;
            }
            cout << "\n" << number;
            ++sum;
        }
        cout << "\n\nThe sum is : " << sum << "\n";
    }
    return 0;
}

现在for循环很容易推理,因为loop未在多个位置修改过。

答案 1 :(得分:0)

当你的号码变为2时,它会进入无限循环。如果阻止,则数字2在第2个中变为1。然后它再次由“number = number + 1”变为2。然后在第二个if块中以“number = number / 2”再次变为1

所以,你需要打破...当数字为2时

答案 2 :(得分:0)

根据您的第一个代码,number是&#34; 1&#34;当它从循环中退出时。

所以&#34;对于&#34;我们有number等于&#34; 1&#34;它不小于&#34; 14&#34;并且编译器不会在任何时候退出for循环。

我认为此代码可以正常运行:

for (int number = 13; number != 2; number = number + 1){    
    cout << "\nFOR THIS NUMBER : " << number;

    while (number > 1){
        if (number % 2 != 0){
            number = 3 * number + 1;
            cout << "\n" << number;
            sum = sum + 1;
        }
        if (number % 2 == 0){
            number = number / 2;
            cout << "\n" << number;
            sum = sum + 1;
        }
    }

答案 3 :(得分:0)

当数字小于1时,你离开内部while循环。然后在显示后你应该休息一下以离开for循环。除非你将infinly循环,因为数字将少于14。

答案 4 :(得分:0)

你需要两个“数字”:一个在for循环控制中,它是当前“数字”,用于启动一个向上/向下的值序列,另一个是当前的“数字”,用于其中一个的向上/向下序列开始“数字”。

当你的for循环返回到顶部时number已用于保存上/下序列中的每个值,但for循环逻辑期望它保持不变。

制作两个变量。

 for (int start = 13; start < 14; start = start + 1){    
    cout << "\nFOR THIS NUMBER : " << start;
    number = start;
    ...
    }

这给出了:

#include <iostream>

using namespace std;

int main(){
    int sum = 0;

    for (int start = 13; start < 14; start = start + 1){    
        cout << "\nFOR THIS NUMBER : " << start;
        number = start;

        while (number > 1){
            if (number % 2 != 0){
                number = 3 * number + 1;
                cout << "\n" << number;
                sum = sum + 1;
            }
            if (number % 2 == 0){
                number = number / 2;
                cout << "\n" << number;
                sum = sum + 1;
            }
        }
        cout << "\n\nThe sum is : " << sum << "\n";
    }
    return 0;
}