C ++程序,如果它是偶数和奇数,则不断除以2,则执行3 * K + 1

c++ program that keeps dividing by 2 if its an even number and its an odd number then it does 3 * k + 1

本文关键字:执行 如果 程序      更新时间:2023-10-16

输入一个正整数k.重复该步骤:如果k是偶数,则将其除以2;否则将其替换为3k + 1。如果数字最终达到 1,请打印成功消息(否则无限循环)。所有 k 达到 1 的情况也称为 科拉茨猜想(谷歌它)。

#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,怎么会来?

问题是你没有按照给出的指示去做。具体说来:

如果 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 );

您没有更新 k 的值。 在你的例子中,k=4,总是newnum=2。 因此,您的循环永远不会终止。

相关文章: