天天看點

poj2793 素數和

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

  

繼續閱讀