【问题标题】:Impelementation error in finding prime no查找素数时的实现错误
【发布时间】:2015-01-23 18:48:28
【问题描述】:


问题-生成素数。
使用的方法 - 不使用优化的 Erathones 筛。
问题代码仅生成 2 和 3。

#include<stdio.h>

int main()
{
    int i,j;
    int primes[100];
    for(i=0;i<=20;i++)
    {
        primes[i]=1;
    }

    primes[0]=0;primes[1]=1;
    for(i=2;i<=20;i++)
    {
        if(primes[i]==1)
        {
            for(j=2;i*j<=20;j++){
                primes[i*j]=0;
            }
        }
    }

    for(i=2;primes[i]!=0&&i<=20;i++)
    {
        printf("%d\n",i);
    }

    return 0;
}

【问题讨论】:

  • 问题是……
  • 为什么代码没有给出所需的输出。它只给出 2 和 3。
  • 除了您知道的问题之外,您的嵌套循环for(i=2;i&lt;=20;i++)for(j=2;j&lt;=20;j++) 中存在潜在的缓冲区溢出。例如,当外部循环将i 设置为19 时,内部循环将遍历j 直到20,结果它将设置primes[19*20]=0。但是 19*20=380,而primes 只分配了 100 个元素。

标签: c algorithm sieve-of-eratosthenes


【解决方案1】:
for(i=2;primes[i]!=0&&i<=20;i++){
  printf("%d\n",i);
}

您的primes[i]!=0 条件将导致循环在遇到非质数(即“4”)时终止。尝试将其分离成自己的条件。

for(i=2;i<=20;i++){
  if (primes[i] != 0){
    printf("%d\n",i);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2018-09-21
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多