题目链接:https://vjudge.net/problem/POJ-2739
题意:
输入一个数,找到有多少组连续的素数之和等于输入的数。
输入:
多组输入,输入一个数,以0作为输入结束的标识。
输出:
输出一个数,表示有多少组连续的素数之和刚好等于输入的数。
解题思路:
1.输入的数小于10 000。所以先把10005内的所有素数找出存放在一个数组里,因为要找连续素数之和,所以先找出素数,减少多组输入的重复计算。
2.因为是连续的,所以从左到右,就用l和r表示左起点和右起点。那对于每个输入就需要两重循环,第一个循环表示起点l从0一直到10005内的最后一个素数,第二个循环确定r(r>=l)。两种情况,刚好有连续素数之和为输入的数,那就是答案+1;而当素数之和大过输入的数,说明再加也不可能有刚好等于的,所以就跳出第二个循环,重新到第一个循环对左起点的l进行++
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int Prime[10010];
int prime[10010];
int len = 0;
void isPrime()
{
for(int i = 2;i < 10010;i++)
{
bool flag = 1;
//for(int j = 2;j <= (int)sqrt((double)i);j++)
for(int j = 2;j < (int)sqrt((double)i)+1;j++)
{
if(i%j==0)
{
flag = 0;
break;
}
}
if(flag)
prime[len++] = i;
}
}
int main()
{
isPrime();
int input;
while(1)
{
scanf("%d",&input);
if(input == 0)
break;
int cnt = 0;
int sum = 0;
//找出所有比input小的作为起始点,同时保证了在len中
for(int r = 0;input>=prime[r] && r<len;r++)
{
sum = 0;
for(int l = r;l < len;l++)
{
sum += prime[l];
if(sum > input)
break;
if(sum == input)
{
cnt++;
break;
}
}
}
printf("%d\n",cnt);
}
return 0;
}