题目链接:http://poj.org/problem?id=2739
题意:给出一个2-10000的数,求出一串连续素数的和等于该数的种数。
题意:打出10000以内的素数表,然后循环求出组合数。
代码:
#include<stdio.h>
#define MAX 10000
int prime1[10000]={0};//标记10000以内的素数,0表示是素数
int prime[1230];//从大到小,储存10000以内的素数,即10000以内的素数表
void getprime()//打出素数表
{
int i, j;
prime1[0] = 1;
prime1[1] = 1;
for (i = 2; i <= MAX/2; i++)
{
if (!prime1[i])
{
for (j = 2; i*j <= MAX; j++)
{
prime1[j*i] = 1;
}
}
}
j=0;
for(i=2;i<=MAX;i++)
if(prime1[i]==0)
{
prime[j]=i;
j++;
}
}
int main()
{
int num, i, count, j, n;
getprime();
while(scanf("%d", &num)==1 && num)
{
count = 0;
for (i=0; i<1230; i++)
{
if (num <= prime[i])
{
break;
}
}
if (num == prime[i])
{
count++;
}
while(i>0)//循环求出所有的连续素数和等于num的种数
{
n = num;
j = i--;
while(j>0 && (n-prime[j-1])>=0)
{
n-=prime[j-1];
if (n < 0)
{
break;
}
else if (n==0)
{
count++;
}
j--;
}
}
printf("%d\n", count);
}
return 0;
}