C++ 求一个数是否为素数

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

代码显示了错误的结果…它显示了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] == 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的回答,其中提到了与您的增量有关的问题