http://poj.org/problem?id=2739
Description
Input
Output
Sample Input
2 3 17 41 20 666 12 53 0
Sample Output
1 1 2 3 0 0 1 2
两种方法。。。
我写的:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int p[10000],prime[10000],a[10000][10000]; int main() { int k=0; memset(prime,true,sizeof(prime)); for(int i=2; i<=10000; i++) { if(prime[i]) { p[k++]=i; for(int j=i*i; j<=10000; j+=i) prime[j]=false; } } /*for(int i=0;i<100;i++) cout << p[i] << " ";*/ for(int i=0;i<k;i++) for(int j=i;j<k;j++) { if(j==0) a[i][j]=p[j]; else a[i][j]=p[j]+a[i][j-1]; } /*for(int i=0;i<10;i++) { for(int j=0;j<10;j++) cout << a[i][j]<<" "; cout << endl; }*/ int p; while(cin >> p) { if(p==0) break; int sum=0; for(int i=0;i<k;i++) for(int j=0;j<k;j++) if(a[i][j]==p) sum++; printf("%d\n",sum); } return 0; }
队友写的:
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define deb system("pause") int p[1000]; const int maxn=10000; int predeal() { bool isp[maxn+5]; memset(isp,true,sizeof(isp)); int n=0,j; for(int i=2;i<maxn+2;i++) { if(isp[i]) { p[n++]=i; for(j=i*i;j<maxn+2;j+=i) isp[j]=false; } } return n; } int main() { int n=predeal(); int a,ans,sum; while(scanf("%d",&a)&&a) { ans=0; for(int i=0;i<n-1;i++) { sum=0; for(int j=i;j<n;j++) { sum+=p[j]; if(sum>=a) { if(sum==a)ans++; break; } } } printf("%d\n",ans); } return 0; }