題目連結: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;
}