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
输入一个正整数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
而不是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 );
您没有更新 k 的值。 在你的例子中,k=4,总是newnum=2。 因此,您的循环永远不会终止。
相关文章:
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 如果函数包含静态变量,为什么编译器不执行内联?
- 如果事件在仍在执行时再次设置,RegisterWaitForSingleObject 是否会并行运行回调?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- 如果发生错误,则返回错误值,否则,继续执行函数
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- 否则,如果语句意外执行,则表现为其他语句
- C ++程序,如果它是偶数和奇数,则不断除以2,则执行3 * K + 1
- 如果默认构造函数不执行任何操作,则目的是什么
- 如果编译器只能执行恒定折叠,则是毫无意义的
- 如果我对循环进行以下更改,执行时间是否会减少
- C++ 如果 Else 两个语句都在不应该执行的时候执行
- 构建一个可执行文件,如果是单个 cpp 文件
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 谁能帮助确定为什么这不能正确执行?如果问题与cast