很抱歉,如果这个问题看起来真的很微不足道,但我只是在学习如何编码,这个让我在电脑前停留了大约2个小时而没有意识到为什么会发生这种情况。
我会传递以下代码。 所以,为了保持简单:
isPrime()是一个只检查当前号码是否为Prime的函数。
nPrime()是一个返回n-ism素数的函数,给定N作为参数。
这里的关键点是主要功能,更准确地说,是第一次循环中的数值。
如果运行此代码,当它到达 number 可分割的最后一个素数时,它将进入无限循环。如果您只是将第一个条件从 while(number> 0)更改为 while(number> 1),则可以轻松解决此问题。
这是我无法意识到的奇怪事情: 如果内部第二个while循环不会退出 number%nPrime(index)!= 0 ,并且的最后一条指令首先在循环是 number / = nPrime(index); ,程序如何进入无限循环?
最后一条指令将数字的值设置为0,因此第一个while循环条件应返回 false 并退出循环。
我错过了什么?
感谢大家的时间和耐心。
PS:我得到了投票,我不知道为什么,所以我会澄清一下:我做了研究。据我所知,每个消息来源似乎都同意这一点:
>当且仅当左操作数大于右操作数时,condition返回true。
这让我看到之前写的问题:如果数字 等于为0,那么while循环如何不评估数字> 0 为 false 并退出迭代?
#include <iostream>
using namespace std;
bool isPrime(int);
int nPrime(int);
int main() {
int number = 264;
if (number > 0)
{
int index = 1;
while(number > 0)
{
while (number % nPrime(index) != 0)
{
index++;
}
cout << nPrime(index) << endl;
number /= nPrime(index);
}
}
else
cout << "Error";
return 0;
}
bool isPrime(int n)
{
bool isPrime = false;
int totalDividends = 0;
for (int i = 1; i <= n; ++i)
{
if (n % i == 0)
totalDividends++;
}
if(totalDividends == 2)
isPrime = true;
return isPrime;
}
int nPrime(int n)
{
int result = 0;
for (int i = 0; i < n; ++i)
{
do
{
result++;
} while (!isPrime(result));
}
return result;
}
答案 0 :(得分:2)
我错过了什么?
最后一条指令将数字的值设为0
不,它没有,它永远不会那么远。当数字等于1时,number % nPrime(index) != 0
总是为真,因此内部while循环永远不会退出。
您对while循环的理解是完美的,这是您对自己的代码所做错误的理解。对于像这样的错误,这是正常的。