为什么for
循环中的while
循环只能运行一次?另外,请告诉我寻找素数的逻辑是否正确。该代码仅显示2作为输出。
#include <iostream>
using namespace std;
int main()
{
int x, z = 0;
int y = 0;
int a = 2;
cout << "Input the number of prime numbers you need: ";
cin >> x;
while (x > 0)
{
for (int i = 1; i < 11; i++)
{
z = a % i;
if (z == 0)
{
y = y + 1;
}
}
if (y < 3)
{
cout << a << ", " << endl;
x = x - 1;
}
a = a + 1;
}
return 0;
}
答案 0 :(得分:1)
您的基本错误是,y
的每次迭代后都没有将变量while
重置为零。它只能增长,并且当测试数字3时,它已经足够大,不允许任何数字通过,因此仅通过数字2。
快速修复:之后
if (y < 3)
{
cout << a << ", " << endl;
x = x - 1;
}
a = a + 1;
插入
y = 0;
另一个错误是您只检查小于11的数字,这意味着例如121(11 * 11)将为假阳性,如果不是,则程序会认为它是质数。
也就是说,您应该学习如何编写自己更容易调试的代码,尤其是使用调试器。如果您从未使用过调试器,请放心,您将轻松找到相应的教程。在您的情况下,调试器会向您显示y的状态,并且您已经看到它达到了它不应该能够达到的数字。
关于将来代码的两个一般提示:
使用描述性变量名。 x和y在我看来像座标,但事实却并非如此。给他们适当的名称,例如number_dividers
而不是y。
将代码分成几部分。例如,具有如下功能:
#include <cmath>
bool is_prime(int number)
{
if(i <= 1) return false;
for(int i = 2; i <= std::sqrt(number); i++)
{
if(number % i == 0) return false;
}
return true;
}
具有这样的功能可以使您的代码更加整洁,允许您重用部分代码,尤其是在您的情况下,允许您单独测试此代码单元,即测试对于给定的输入是否具有正确的输出(基本上是单元测试)。
您的代码现在为:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
//(insert code from above here)
int main()
{
int required_primes = 0;
cout << "State the amount of prime numbers to be found: ";
cin >> required_primes;
int found_primes = 0;
int current_number = 2;
while(found_primes < required_primes)
{
if(is_prime(current_number))
{
cout << "Found prime: " << current_number << endl;
found_primes++;
}
current_number++;
}
}
(描述性的变量名使初次看代码的人更容易理解,您同意吗?)
答案 1 :(得分:-1)
这将解决问题。
#include <iostream>
using namespace std;
int main()
{
int x, z = 0;
int a = 2;
cout << "Input the number of prime numbers you need: ";
cin >> x;
while (x > 0)
{
bool isPrime = true;
for (int i = 2; i < a; i++)
{
z = a % i;
if (z == 0)
{
isPrime = false;
}
}
if (isPrime)
{
cout << a << ", " << endl;
x = x - 1;
}
a = a + 1;
}
return 0;
}