【问题标题】:Finding Primes, where did I got wrong?寻找素数,我哪里做错了?
【发布时间】:2016-02-16 03:34:45
【问题描述】:

所以...它适用于小数字,但如果 temp 大于 1000,它只会打印 0 或随机数...

#include <stdio.h>

int main() {
    int primes[10001];
    primes[10000] = 0;
    int i,temp;
    int n = 2;
    temp = 0;
    while(temp<=1000){
        for(i=2; i<n; i++){
            if(n%i == 0){
                goto Exit;
            }
        }primes[temp] = n; temp ++;
        Exit:
        n ++;
    }
    for(i=0; i<10001; i++){
        printf("%d\n",primes[i]);
    }
    return 0;
 }

【问题讨论】:

  • while(temp&lt;=1000){ --> while(temp&lt;=10000){
  • 您只需将i 循环到sqrt(n) 即可将算法速度提高378 倍。要计算滚动 sqrt 值:初始化 nr = 0。此外,在顶部添加 2 作为素数。然后在while(temp...) 和你的for 循环插入:while ((nr * nr) &lt; n) nr += 1;。然后将 for 循环更改为 for (i = 3; i &lt;= nr; ++i) 对于前 30003 个素数,这会将运行时间从 68.95 秒减少到 0.18 秒

标签: c primes


【解决方案1】:

The 1,000th prime is 7919The 10,000th prime is 104,729。 在某些系统上,int 是 16 位 (65,535)。这对于 1,000 个素数来说足够大,但对于 10,000 个素数来说就不够了。尝试将所有 int 变量更改为 long 变量。

【讨论】:

    【解决方案2】:

    您的循环条件是 temp 1000 时,您的循环不起作用。我认为您应该在循环条件下给出 10000 而不是 1000。

    【讨论】: