UVA1210 Sum of Consecutive Prime Numbers题解

题目大意

有多组数据,每组一个n,以0结尾,若n=0,程序结束,求有多少种方法将n写成连续素数之和(n<=10000)。

分析

可预先将1到10000的素数和其前缀和处理出来,记为数组sum,在进行循环,判断是否有i,j,使得sum[i]-sum[j]=n,若有,则ans++。最后输出ans,时间为80ms。

#include<bits/stdc++.h>
using namespace std;
int prime[10001],sum[10001],v[10001],m=0,n;
void P(){
    memset(prime,0,sizeof(prime));
    memset(v,0,sizeof(v));
    memset(sum,0,sizeof(sum));
    for(int i=2;i<=10000;i++){
        if(!v[i]){
            v[i]=i;
            prime[++m]=i;
            sum[m]=sum[m-1]+i;
        }
        for(int j=1;j<=m;j++){
            if(prime[j]>v[i]||prime[j]>10000/i)
                break;
            v[i*prime[j]]=prime[j];
        }
    }
}
int main(){
    P();
    while(scanf("%d",&n)){
        int ans=0;
        if(!n)
            break;
        for(int i=1;i<=m;i++){
            for(int j=0;j<i;j++){
                if(sum[i]-sum[j]==n){
                    ans++;
                }   
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sjzezwzy/article/details/80312987