c ++程序,如果是偶数,则除以2除以奇数,然后除以3 * k + 1

时间:2018-03-23 02:36:16

标签: c++ loops

  

输入正整数k。重复步骤:如果k为偶数,则除以2;否则用3k + 1替换它。如果数字最终达到1,则打印成功消息(否则为无限循环)。所有k达到1的情况也称为   Collat​​z猜想(谷歌)。

#include <iostream>

using namespace std;

int main(){
    int k = 0;
    int iter = 0;
    int newnum = 0;
    cout << "What is k?";
    cin >> k;
    do{
        if( k %2 == 0){  
            newnum = k/2;
        }
        else if( k % 2 == 1){
            newnum = 3 * k+ 1;
        }
    }
    while( newnum != 1);
    cout << newnum;
    return 0;
}

如果我输入4,它什么都不输出,但如果我输入2,则输出1.如果赢了继续除以2怎么样?

2 个答案:

答案 0 :(得分:2)

问题是你没有按照给出的指示行事。具体做法是:

  

如果k为偶数,则将其除以2;否则用3k + 1替换

您的代码中的任何一点都没有将计算结果分配回k,就像说明要求您那样。

输入4后,您将k除以2并将结果分配给newnum而不是knewnum不是1,所以你再次循环,但是k仍然是4,所以你再次分开循环,一次又一次,无休止地。这就是为什么你没有看到任何输出。

当您输入2时,将k除以2并将结果分配给newnum,现在为1,因此循环结束并输出newnum。这就是你在输出中看到1的原因。

如果您使用调试器逐步完成代码,您可能已经亲眼看到了这一点。调试是程序员必备的技能,因此您需要学习如何操作。

要修复此代码,请在继续循环之前将newnum分配回k

do {
    if( k % 2 == 0 ) {
        newnum = k / 2;
    }
    else { // <-- no need for an 'if' here
        newnum = (3 * k) + 1;
    }
    k = newnum; // <-- add this
}
while( k != 1 ); // <-- change this

或者,只需删除newnum并将计算结果直接分配回k

do{
    if( k % 2 == 0 ) {
        k = k / 2; // or: k /= 2;
    }
    else {
        k = (3 * k) + 1;
    }
}
while( k != 1 );

答案 1 :(得分:0)

您没有更新k的值。 在你的情况下,k = 4,并且总是newnum = 2。 所以你的循环永远不会终止。