程序填空题:素数累加
算法的效率很大程度上决定了程序的效率。例如,对于”判断某个大于等于 `3` 的整数是否是素数“的算法,有以下两个方式来避免多余计算:
1. 仅当该数是奇数才做进一步检查,因为偶数必然是素数(`2` 除外);
2. 寻找该数的约数时,上界设为该数的平方根即可;
根据以上思路,完成下列程序。该程序接受输入 `M` 和 `N`,约定 `3<=M<=N<=100`;程序寻找区间 `[M, N]` 内的素数并累加,最后还一并输出检查过的整数的个数、素数个数。
样例如下:
* 输入1:3 20
* 输出1:We checked 9 numbers in \[3, 20\], and found 7 prime numbers, sum of them is 75.
```C
#include <@@[math.h](1)>
#include
int main()
{
int M, N, isPrime, total = 0, count = 0, sum = 0;
scanf("%d %d", &M, &N);
int i = (M % 2 == 0 ? M + 1 : M);
for(; i <= N; @@[i = i + 2](2)) {
total++;
isPrime = 1;
for(int j = 3; j <= (int)sqrt(i); ++j) {
if(@@[i % j == 0](2)) {
isPrime = 0;
break;
}
}
if(isPrime) {
count++;
sum += i;
}
}
printf(
"We checked %d numbers in [%d, %d], and found %d prime numbers, sum of them is %d.\n", total, M, N, count, sum);
return 0;
}
```
答案:
第1空:math.h
第2空:i = i + 2
第3空:i % j == 0
1. 仅当该数是奇数才做进一步检查,因为偶数必然是素数(`2` 除外);
2. 寻找该数的约数时,上界设为该数的平方根即可;
根据以上思路,完成下列程序。该程序接受输入 `M` 和 `N`,约定 `3<=M<=N<=100`;程序寻找区间 `[M, N]` 内的素数并累加,最后还一并输出检查过的整数的个数、素数个数。
样例如下:
* 输入1:3 20
* 输出1:We checked 9 numbers in \[3, 20\], and found 7 prime numbers, sum of them is 75.
```C
#include <@@[math.h](1)>
#include
int main()
{
int M, N, isPrime, total = 0, count = 0, sum = 0;
scanf("%d %d", &M, &N);
int i = (M % 2 == 0 ? M + 1 : M);
for(; i <= N; @@[i = i + 2](2)) {
total++;
isPrime = 1;
for(int j = 3; j <= (int)sqrt(i); ++j) {
if(@@[i % j == 0](2)) {
isPrime = 0;
break;
}
}
if(isPrime) {
count++;
sum += i;
}
}
printf(
"We checked %d numbers in [%d, %d], and found %d prime numbers, sum of them is %d.\n", total, M, N, count, sum);
return 0;
}
```
答案:
第1空:math.h
第2空:i = i + 2
第3空:i % j == 0