一、题目大意
给出一个数字num,求出由连续素数求和形成num的种类数
二、解题思路
用埃式筛法得到10000以内的素数,放在vector里,然后对这个vector去做尺取法,按照如下形式
1、定义left、right和sum为0
2、当sum<num且right<vector.size()时不断的让sum+=vector[right++]
3、如果循环结束,sum<num,则break,不执行4
4、如果sum==num,则count++
5、sum-=vector[left++]回到2
三、代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool isPrime[10007];
vector<int> primeVector;
int num;
void sieve()
{
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i <= 10000; i++)
{
isPrime[i] = true;
}
for (int i = 1; i * i <= 10000; i++)
{
if (!isPrime[i])
{
continue;
}
for (int j = 2 * i; j <= 10000; j += i)
{
isPrime[j] = false;
}
}
}
void pushPrimeToVector()
{
for (int i = 1; i <= 10000; i++)
{
if (isPrime[i])
{
primeVector.push_back(i);
}
}
}
void solve()
{
int left = 0, right = 0, count = 0, sum = 0;
while (true)
{
while (sum < num && right < primeVector.size())
{
sum += primeVector[right++];
}
if (sum < num)
{
break;
}
if (sum == num)
{
count++;
}
sum -= primeVector[left++];
}
printf("%d\n", count);
}
int main()
{
sieve();
pushPrimeToVector();
while (true)
{
scanf("%d", &num);
if (num == 0)
{
break;
}
solve();
}
return 0;
}