【问题标题】:finding a number is prime or not找出一个数是否是素数
【发布时间】:2019-10-25 02:11:40
【问题描述】:

代码显示错误的结果...它显示 15,21 和许多其他奇数为素数,但它们不是...如何解决问题?..我应该在主要部分 [inside int main()]?

#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;
    }
}

是因为没有正确使用或调用函数而导致的错误答案吗?......在这种情况下应该怎么做......

【问题讨论】:

  • 看来sieve()函数的意图是找到所有的素数。您能否将手指指向显示的代码中调用此函数的确切行,并准确解释您希望何时调用此函数以及如何调用?

标签: c++ primes


【解决方案1】:

我的猜测是,由于您从不调用 sieve 函数,因此您的 marked 数组永远不会被填充。由于marked 不是动态分配的,它在您的程序中被清零。因此,在您的 isPrime 函数中,所有奇数将通过您的 if 语句级联,然后到达 marked[n] == false 的部分,因为 marked[n] 的所有条目都为 0,所以它会返回 true,这相当于布尔值false

您可能想知道最好在哪里运行 sieve 函数。

【讨论】:

  • 那代码应该怎么写?...你能把代码写下来吗?
  • 您应该包括对sieve 函数的调用。根据您拥有的代码,最好将其包含在cin &gt;&gt; n; 之后的行中,例如sieve(n);
  • 还要看看 Dmitry 的回答,提到你的增量存在问题
【解决方案2】:

这里的增量有误:

for (int j = i * i; j <= n; j += i + i)

您需要将j 增加i,但实际上您增加了2*i。无论如何,我同意您从不致电sieve 的先前答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 2012-07-20
    • 2015-09-15
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多