编程题:h0005.连续质数的和
一些正整数能够表示为一个或多个连续素数的和。给出一个正整数,有多少个这样的表示?例如,整数53有两个表示:5+7+11+13+17和53;整数41有三个表示:2+3+5+7+11+13,11+13+17和41;整数3只有一个表示:3;整数20没有这样的表示。注意加法操作数必须是连续的素数,因此,对于整数20,7+13 和 3+5+5+7 都不是有效的表示。
请写一个程序,对于一个给出的正整数,程序给出连续素数的和的表示数。
### 输入格式:
输入一个正整数序列,每个数一行,在2到10000之间取值。输入结束以0表示。
### 输出格式:
输出的每一行对应输入的每一行,除了最后的0。输出的每一行对于一个输入的正整数,给出连续素数的和的表示数。输出中没有其他的字符。
### 输入样例:
in
2
3
17
41
20
666
12
53
8819
8929
9719
0
### 输出样例:
out
1
1
2
3
0
0
1
2
4
1
1
答案:若无答案欢迎评论
由于每个测试用例都要计算素数,且素数上限为10000,因此:
首先,我们离线计算出[2..10001]内的所有素数,按照递增顺序存入数组prime[1.. total]。
然后,依次处理每个测试用例:
设当前测试用例的输入为n;连续素数的和为cnt;cnt==n的表示数为ans。
采用双重循环计算n的表示数ans:
外循环i:枚举所有可能的最小素数prime[i](for (int i=0; n>=prime[i]; i++));
内循环j:枚举由prime[i]开始的连续素数的和cnt,条件是所有素数在prime[ ]中且cnt不大于n(for (int j=i; j < total && cnt<n; j++) cnt += prime[j])。内循环结束后,若cnt==n,则ans++。
外循环结束后得出的ans即为问题解。
请写一个程序,对于一个给出的正整数,程序给出连续素数的和的表示数。
### 输入格式:
输入一个正整数序列,每个数一行,在2到10000之间取值。输入结束以0表示。
### 输出格式:
输出的每一行对应输入的每一行,除了最后的0。输出的每一行对于一个输入的正整数,给出连续素数的和的表示数。输出中没有其他的字符。
### 输入样例:
in
2
3
17
41
20
666
12
53
8819
8929
9719
0
### 输出样例:
out
1
1
2
3
0
0
1
2
4
1
1
答案:若无答案欢迎评论
由于每个测试用例都要计算素数,且素数上限为10000,因此:
首先,我们离线计算出[2..10001]内的所有素数,按照递增顺序存入数组prime[1.. total]。
然后,依次处理每个测试用例:
设当前测试用例的输入为n;连续素数的和为cnt;cnt==n的表示数为ans。
采用双重循环计算n的表示数ans:
外循环i:枚举所有可能的最小素数prime[i](for (int i=0; n>=prime[i]; i++));
内循环j:枚举由prime[i]开始的连续素数的和cnt,条件是所有素数在prime[ ]中且cnt不大于n(for (int j=i; j < total && cnt<n; j++) cnt += prime[j])。内循环结束后,若cnt==n,则ans++。
外循环结束后得出的ans即为问题解。