题目链接:https://vjudge.net/problem/POJ-2739
输入一个数字n,判断有没有一段连续的素数之和大于n,如果有,计算总共有几种。
思路:用素数筛法求出10000以内的素数,然后可以用尺取法计算,我这里是计算先打表计算所有编号为i到编号为j的素数之和,然后再循环查找。
代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int vis[10010],num[1300],sum[1300][1300]; int n,m,k,t,cnt; void play_table() { memset(vis,0,sizeof(vis)); memset(sum,0,sizeof(sum)); cnt=0; for(int i=2;i<=10000;i++) { if(!vis[i]) { num[++cnt]=i;//记录素数 vis[i]=1; for(int j=i*2;j<=10000;j+=i) vis[j]=1; } } for(int i=1;i<=cnt;i++)//计算i到j的和 { for(int j=i;j<=cnt;j++) { sum[i][j]+=sum[i][j-1]+num[j]; } } } int main() { play_table(); while((cin>>n)&&n) { int ans=0; for(int i=1;i<=cnt;i++) { if(num[i]>n) break; for(int j=i;j<=cnt;j++) { if(sum[i][j]>n) break; if(sum[i][j]==n) { ans++; } } } cout<<ans<<endl; } return 0; }