我正在尝试打印系列中的所有素数,我最终得到的代码在下面,而不是打印所有素数,它打印随机数,有些是素数,有些则不是:/ 为什么会这样?
#include <iostream>
using namespace std;
long int x,y=3;
int a=3;
bool isprime;
int main()
{
while(a<=100)
{
for(x=2;x<=y;x++)
{
if(y%x==0 && x!=y)
{
isprime=false;
break;
}
else if(y%x!=0 && x!=y)
{
isprime = true;
}
}
if(isprime==true && y%x!=0 && x!=y)
{
cout<<a<<" is a prime number."<<"\n";
isprime=false;
}
a++;
y++;
}
}
答案 0 :(得分:1)
此
if(isprime=true && a%x!=0 && a!=y)
应该是这个
if(isprime==true && a%x!=0 && a!=y)
这是一个常见的错误。但更好的是要意识到你不需要将bool与false的真实比较,因为它们是是真还是假。所以只是
if (isprime && a%x!=0 && a!=y)
逻辑看起来都错了(而且太复杂了),试试这个
isprime = true;
for(x=2;x<a;x++)
{
if(a%x==0)
{
isprime = false;
break;
}
}
if (isprime)
{
cout<<a<<"\n";
}
不需要y。
答案 1 :(得分:1)
那些跳进我眼中的是你永远不会增加y。
y在开头是3,所以你只能尝试2是a的可能除数然后转到下一个a。
无论如何,我不确定你想用y实现什么。
让x从2运行到a / 2,因为不需要尝试大于a / 2的数字。 这只是因为从来没有比a / 2更大的除数。 示例:a = 30.尝试除以16或更大是没有意义的,因为结果永远不会是整数(当然除了它本身)
然而,这应该做你想要的:
int x = 0;
int a = 0;
bool isPrime = false;
for(a=3; a < 100; a+=2)
{
isPrime = true;
for(x = 2; x <= a/2; x++) {
if(a%x == 0) {
isPrime = false;
break;
}
}
if(isPrime) {
cout << a << "\n";
}
}
当然有其他算法可以找到素数,但我想基本上使用你的方法。
干杯
克里斯
编辑: 有人速度更快:)。
无论如何:没有必要高于a / 2运行,这是一个重要的优化......!
EDIT2:
另一个优化当然是跳过所有偶数,所以从a = 3开始,每次循环迭代递增2 ...
答案 2 :(得分:1)
我现在看到你的代码还可以。 然而,我做了一些小改动,清理代码并使其更快一些。
#include <iostream>
using namespace std;
long int x, y = 2;
int a = 3;
bool isprime;
int main() {
while (a <= 100) {
while ((y + 1) * (y + 1) <= a) {
y++;
}
isprime = true;
for (x = 3; x <= y; x += 2) {
if (a % x == 0) {
isprime = false;
break;
}
}
if (isprime) {
cout << a << " is a prime number." << "\n";
}
a+=2;
}
}