题目链接:http://poj.org/problem?id=2739
#include<iostream> using namespace std; int count=0; int prim[1234]={2,3}; void primer() { //列出所有素数 int f,i,j,q=2; for(i=5;i<10000;i+=2) { for(j=0,f=1;prim[j]*prim[j]<=i;j++) if(i%prim[j]==0)f=0; if(f) { prim[q++]=i; //小技巧 } } } void minu(int n,int i) { if(i<0)return ; if(n==prim[i]) { count++; } else if(n>prim[i]) minu(n-prim[i],i-1); else return ; return; } int main() { primer(); int n,k,i; while(cin>>n) {if(n==0)break; for( i=0;i<1230;i++) if(n==prim[i]){count++;k=i-1;break;} else if(n<prim[i]){k=i-1;break;} //找到k(和输入的数最接近的素数的位置) for( i=k;i>=0;i--) minu(n,i); //倒着减找到,和相等的组合 cout<<count<<endl; count=0; } return 0; }