输入正整数k。重复步骤:如果k为偶数,则除以2;否则用3k + 1替换它。如果数字最终达到1,则打印成功消息(否则为无限循环)。所有k达到1的情况也称为 Collatz猜想(谷歌)。
#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怎么样?
答案 0 :(得分:2)
问题是你没有按照给出的指示行事。具体做法是:
如果k为偶数,则将其除以2;否则用3k + 1替换。
您的代码中的任何一点都没有将计算结果分配回k
,就像说明要求您那样。
输入4后,您将k
除以2并将结果分配给newnum
而不是k
。 newnum
不是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。 所以你的循环永远不会终止。