http://poj.org/problem?id=2739
题意 :一个正整数能够表示为一个或多个连续素数和,给你一个正整数,让你求,有多少个这样的表示。例如:整数53有两种表示方法,5+7+11+13+17和53,41有三种表示方法,2+3+5+7+11+13,11+13+17还有41,而整数20没有这样的表示方法。
思路 :因为取值到10000,所以先素数打表,然后枚举所有的表示方法中连续的素数里最小的那个即可。
#include <iostream> using namespace std; const int maxp = 2000,n = 10000 ; int prime[maxp],total = 0 ; bool isprime(int k) { for(int i = 0 ; i < total ; i++) if(k % prime[i] == 0) return false ; return true ; } int main() { for(int i = 2 ; i <= n ; i++) { if(isprime(i)) prime[total++] = i ; } prime[total] = n+1 ; int m ; while(cin>>m &&m) { int ans = 0 ;//次数初始化为0 for(int i = 0 ; m >= prime[i] ; i++) { int cnt = 0 ;//求连续素数的和 for(int j = i ; j < total&&cnt < m ; j++) cnt += prime[j] ; if(cnt == m) ++ans ; } cout<<ans<<endl ; } return 0; }