不知道这个无限循环是从哪里来的

Not sure where this infinite loop is coming from

本文关键字:无限循环 不知道      更新时间:2023-10-16

我从C进入C++,我可能缺少一些非常基本的东西。

我正在尝试用科拉茨猜想制作一个程序。 在循环的第一次迭代之前,i 和 j 都正确等于 1 和 10。 但是,尽管我的循环中有 i++,但 i 的值似乎从未改变。

我以为这将是一个快速编码的程序,但我对此感到困惑。任何帮助将不胜感激。

int n, j, i, count = 0;
cin >> n >> j;
for (i = n; i < j; i++){
while (i != 1){
if (i % 2 == 0)
i = i/2;
else
i = 3*i + 1;
}
count++;
cout << i << endl;
}

代码中的问题是,在运行测试猜想是否适用于iwhile循环后,根据定义,i被设置回1(因为这是退出循环的条件),因此i++每次都会从1递增到2。你永远过不了2.

如果你试图测试从nj的所有数字的科拉茨猜想,你需要在while循环中使用一个不同于迭代的变量。

如果count应该告诉你需要多少个周期,你需要在每个while循环之前将其归零,并在while循环内递增。

int n, j, i;
cin >> n >> j;
for (i = n; i < j; i++){
int test = i;
int count = 0;
while (test != 1){
if (test % 2 == 0) {
test = test/2;
} else {
test = 3*test + 1;
}
count++;
}
cout << i << ' ' << count << endl;
}

不确定它的全部内容,但这里有一些快速观察:

您的while(i != 1)循环意味着它将无限期运行,或者当此循环结束时i将等于1。这意味着您的for (i = n; i < j; i++){循环将始终以i=1.难怪这是一个死循环。

在循环的第一次迭代之前,i 和 j 都正确等于 1 和 10。

让我们重播外循环的第二次迭代。

在此之前,在第一次迭代结束时,i已递增到等于 2。现在

  1. i % 2 == 0=>i := i / 2,即i := 1.
  2. 现在i == 1,内循环结束。
  3. i递增,现在等于 2。
  4. 重复。

在这种情况下,您只需在每次循环迭代i = k将循环变量复制到新变量,这样 for 循环变量就不会受到影响

#include <iostream>
int main(){
int min, max, count = 0;
std::cin >> min >> max;
for (int k = min; k <= max; ++k){ 
i = k;
while (i != 1)
{
if (i % 2 == 0)
i /= 2;
else
i = 3*i + 1;
count++;
std::cout << i << std::endl; //ONLY IF U WANT TO PRINT i EVERY ITERATION                                                                                                                    
}
std::cout << "Number of iterations needed: " << count << " for i = " << i << std:: endl;
}