首页 > 试题广场 >

编一个程序求质数的和,例如F(7) = 2+3+5+7+11

[问答题]
编一个程序求质数的和,例如F(7) = 2+3+5+7+11+13+17=58。
用欧拉筛法筛出10000000以内的所有质数,共有664579个。详细解释参见下面的代码。

#include<stdio.h>

const int maxn = 10000001;
int u[maxn];//筛子
int p[1000000];//质数表:10^7以内的质数有664579个
int cnt;//质数总个数,兼作质数表下标

typedef long long ll;
ll f[1000000];

void sieve()//欧拉筛法,时间复杂度O(n)
{
for (int i = 2; i < maxn; i++)u[i] = 1;
for (int i = 2; i < maxn; i++)//顺序分析整数区间的每个数
{
if (u[i])p[cnt++] = i;//i是质数,存入质数表
for (int j = 0; j < cnt; j++)//搜索质数表的每个数
{
if (i * p[j] > maxn)break;//若i与当前质数的乘积超出范围,则分析下一个整数i
u[i * p[j]] = 0;//筛去i的倍数
if (i % p[j] == 0)break;//若当前质数为i的最小质因子,则分析下一个整数i
}
}
}

void compute()
{
for (int i = 1; i <= cnt; i++)
{//离线计算前i个质数之和
f[i] = f[i - 1] + p[i - 1];
}
}

int main(int argc, char const *argv[])
{
sieve();//执行筛法
compute();//计算质数之和

int n;//第n个质数
while (scanf("%d", &n) != EOF)//循环输入直到文件尾
{
printf("%lld\n", f[n]);//前n个质数之和
}
return 0;
}
发表于 2016-06-28 21:39:04 回复(0)

#include <stdio.h>

#include <math.h>

int isPrime( int n)

{

    int i,flag= 0 ;

    if (n>= 2 ) {

        for (i= 2 ; i<n- 1 ; i++)

        {

            if (n%i== 0 ) {

                flag= 1 ;

            }

        }

    } else

    {

        return 0 ;

    }

    

    if (flag) {

        return 0 ;

    } else

    {

        return 1 ;

    }

}

int main(){

    int n,i,j;

    while ( scanf ( "%d" ,&n)!= EOF ){

        int sum= 0 ,k= 0 ;

        for (i= 0 ; i<n; i++) {

            for (j= 0 ; j< 1000 ; j++) {

                if ( isPrime (j)&&k<n) {

                    sum+=j;

                    k++;

                }

            }

            

        }

        printf ( "%d\n" ,sum);

        

    }

    return 0 ;

}

发表于 2015-10-19 00:05:51 回复(0)
方法1:
对于从2开始的递增整数n进行如下操作:
用 [2,n-1] 中的数依次去除n,如果余数为0,则说明n不是质数;如果所有余数都不是0,则说明n是质数,对其进行加和。
空间复杂度为O(1),时间复杂度为O(n^2),其中n为需要找到的最大质数值(例子对应的值为17)。
方法2:
可以维护一个质数序列,这样当需要判断一个数是否是质数时,只需判断是否能被比自己小的质数整除即可。
对于从2开始的递增整数n进行如下操作:
用 [2,n-1] 中的质数(2,3,5,7,开始时此序列为空)依次去除n,如果余数为0,则说明n不是质数;如果所有余数都不是0,则说明n是质数,将此质数加入质数序列,并对其进行加和。
空间复杂度为O(m),时间复杂度为O(mn),其中m为质数的个数(例子对应的值为7),n为需要找到的最大质数值(例子对应的值为17)。
方法3:
也可以不用除法,而用加法。
申请一个足够大的空间,每个bit对应一个整数,开始将所有的bit都初始化为0。对于已知的质数(开始时只有2),将此质数所有的倍数对应的bit都改为1,那么最小的值为0的bit对应的数就是一个质数。对新获得的质数的倍数也进行标注。对这样获得的质数序列累加就可以获得质数和。空间复杂度为O(n),时间负责度为O(n),其中n为需要找到的最大质数值(例子对应的值为17)。
发表于 2014-10-25 00:26:11 回复(0)