欧拉计划之题目10:计算两百万以下所有质数的和。

本题来自:http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/11-10

不晓得怎么,200W要运行5s,望谁能优化···

#include <stdio.h>
const int num=2000000;
int SunPrime(int n)
{
    int sum=5,flag=0;
    for(int i=5;i<n;i=i+2)
    {
        for(int j=2;j*j<=i;j++)
        {
            if(i%j)
            {
                flag=1;
            }
            else
            {
                flag=0;
                break;
            }
        }
        if(flag)sum=sum+i;
    }
    return sum;
}
int main()
{
    printf("%d
",SunPrime(num));
    return 0;
}

筛法求素数

基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。如有:

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:
3 5 7 9 11 13 15 17 19 21 23 25 27 29
剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为:
2 3 5 7 11 13 17 19 23 29
 
使用该思想,秒出答案:
# include <stdio.h>
# include <string.h>
long long isprime[2000010], primes[2000010], cnt;
int main ()
{
    long long n = 2000000;
    long long i, j, sum = 0;
    memset (isprime, 1, sizeof(isprime));
    for (i = 2; i <= 2000000; i++)
    {
        if (!isprime[i]) continue ;
        primes[cnt++] = i;
        sum += i;
        for (j = i*i ; j <= 2000000 && i <= 1500; j += i)
        {
            isprime[j] = 0;
        }
    }
//    sum = 0;
//    for (i = 0 ; i < cnt ; i++)
//    sum += primes[i];
    printf ("%I64d
", sum);
    return 0;
}
原文地址:https://www.cnblogs.com/orange1438/p/3500305.html