C++ 求一个数是否为素数
代码显示了错误的结果…它显示了15,21和许多其他奇数作为素数,但它们不是…如何解决问题?。我应该在main部分[intmain]中编写什么代码C++ 求一个数是否为素数,c++,primes,C++,Primes,代码显示了错误的结果…它显示了15,21和许多其他奇数作为素数,但它们不是…如何解决问题?。我应该在main部分[intmain]中编写什么代码 #include<bits/stdc++.h> using namespace std; #define M 1000000 bool marked[M]; bool sieve(int n) { for (int i = 3; i * i <= n; i += 2) { if (marked[i
#include<bits/stdc++.h>
using namespace std;
#define M 1000000
bool marked[M];
bool sieve(int n)
{
for (int i = 3; i * i <= n; i += 2)
{
if (marked[i] == false)
{
for (int j = i * i; j <= n; j += i + i)
{
marked[j] = true;
}
}
}
}
bool isPrime(int n)
{
if (n < 2)
return false;
if (n == 2)
return true;
if (n % 2 == 0)
return false;
return marked[n] == false;
}
int main()
{
int i,j,k,n,m;
cin>>n;
for(i=0; i<n; i++)
{
cin>>m;
if(isPrime(m))
cout<<"prime"<<endl;
else
cout<<"N"<<endl;
}
}
错误答案是否是由于未正确使用或调用函数造成的?……在这种情况下,应该怎么做……我的猜测是,由于您从未调用过筛选函数,因此标记的数组永远不会被填充。因为标记不是动态分配的,所以它在程序中被调零。因此,在iPrime函数中,所有奇数将通过if语句级联,然后命中标记为[n]==false的部分,该部分将返回true,因为标记为[n]的所有条目都为0,这相当于布尔值false
您可能想找出在哪里最好运行sieve函数。此处的增量错误:
for (int j = i * i; j <= n; j += i + i)
你需要把j增加i,但实际上是增加了2*i。无论如何,我同意前面的答案,即您永远不会调用sieve。似乎sieve函数的目的是查找所有的素数。你能指出所示代码中调用此函数的确切行吗,并准确地解释你期望何时调用此函数,以及如何调用?那么代码应该是如何调用的?…你能写下代码吗?你应该包括对sieve函数的调用。根据您拥有的代码,最好将其包含在cin>>n;之后的行中;,有点像西文;。另外,请务必查看Dmitry的回答,其中提到了与您的增量有关的问题