• 欧拉计划之题目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;
    }
  • 相关阅读:
    基于Lucene/XML的站内全文检索解决方案
    内容管理系统(CMS)的设计和选型
    Lucene入门与使用[转]
    为自己的系统搞个全文搜索 参考值:2 (转)
    C# 时间函数
    Lucene倒排索引原理(转)
    什么是内容管理系统CMS?
    网络测试常用命令
    C#与C的区别
    人生致命的八个经典问题
  • 原文地址:https://www.cnblogs.com/orange1438/p/3500305.html
Copyright © 2020-2023  润新知