这一题主要的就是计算素数,根据题目要求,只用计算10000以内的。
关于计算10000以内的素数我是这么写的:
//计算素数
memset(prime,1,sizeof(prime));
prime[0] = 0,prime[1] = 0;
for(int i = 2; i < max; i++)
{
if(prime[i] == 1)
{
for(int j = 2; i*j <= max; j++)
{
prime[i*j] = 0;
}
}
}
其中max是用宏定义的一个上界,这里是10001。
先用memset把全部数字都置为1,表示是素数,然后特别地,把0和1这两个不是素数的设成0。
然后再从2开始,针对每一个prime[i] != 0的数i(即是素数的i),用一个从2开始(其本身必定是素数,但是2倍则不是),一直到
i*j>max为止,这些i*j都不是素数,因为他们能被1,i以及本身整除。
然后再用一个循环,把素数从小到大放到另一个数组中:
//素数数组,共有total个素数,从0到total-1
int total = 0;
for(int i = 2; i < max; i++)
{
if(prime[i])
p[total++] = i;
}
然后剩下的就简单了
对于输入的每个数字都,都进行一次计算有多少种连续素数相加能够得到这个数的可能:
对每个素数的起点算一次,如2+3+5...,然后再3+5+7...,再5+7.....直到大于输入的那个数字为止,特别地,如果开始计算的那个素数就是输入的数,那么也要count+1
附上整个cpp:
#include<iostream>
#include<cstring>
using namespace std;
#define max 10001
char prime[10001];
int p[10001];
int main()
{
//计算素数
memset(prime,1,sizeof(prime));
prime[0] = 0,prime[1] = 0;
for(int i = 2; i < max; i++)
{
if(prime[i] == 1)
{
for(int j = 2; i*j <= max; j++)
{
prime[i*j] = 0;
}
}
}
//素数数组,共有total个素数,从0到total-1
int total = 0;
for(int i = 2; i < max; i++)
{
if(prime[i])
p[total++] = i;
}
//计算每个数有多少种连续素数求和的可能
int n;
while(cin >> n && n != 0)
{
int count = 0;
//对每个素数的起点算一次
for(int i = 0; i < total; i++)
{
int sum = p[i];
if(p[i] == n)
count++;
for(int j = i + 1; sum <= n; j++)
{
sum += p[j];
if(sum == n)
count++;
}
}
cout << count << endl;
}
}