分数 20
全屏浏览题目
切换布局
作者 张高燕
单位 浙大城市学院
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
函数接口定义:
int prime( int p ); int PrimeSum( int m, int n );
其中函数prime
当用户传入参数p
为素数时返回1,否则返回0;函数PrimeSum
返回区间[m
, n
]内所有素数的和。题目保证用户传入的参数m
≤n
。
裁判测试程序样例:
#include <stdio.h> #include <math.h> int prime( int p ); int PrimeSum( int m, int n ); int main() { int m, n, p; scanf("%d %d", &m, &n); printf("Sum of ( "); for( p=m; p<=n; p++ ) { if( prime(p) != 0 ) printf("%d ", p); } printf(") = %d\n", PrimeSum(m, n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
-1 10
输出样例:
Sum of ( 2 3 5 7 ) = 17
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
我的答案:
分析过程
这道题目要求判断一个数是否是素数并计算给定范围内所有素数的和。所以我们首先需要一个函数来判断一个数是否是素数,然后用另一个函数来计算素数的和。
-
判断素数:
- 所有小于2的整数都不是素数。
- 2是最小的素数。
- 对于大于2的数,如果它有一个小于或等于它平方根的因子,那么它就不是素数。
-
计算素数和:
- 遍历m到n之间的所有整数,使用
prime
函数判断每个数是否是素数。如果是,就累加到总和中。
- 遍历m到n之间的所有整数,使用
解题过程
C语言:
#include <stdio.h>
#include <math.h>
// 判断是否是素数的函数
int prime(int p) {
if (p < 2) return 0; // 小于2的数不是素数
if (p == 2) return 1; // 2是素数
if (p % 2 == 0) return 0; // 除2外的偶数不是素数
int sqrtP = (int)sqrt(p);
for (int i = 3; i <= sqrtP; i += 2) { // 只考虑奇数作为可能的因子
if (p % i == 0) return 0;
}
return 1;
}
// 计算m到n之间所有素数的和
int PrimeSum(int m, int n) {
int sum = 0;
for (int i = m; i <= n; i++) {
if (prime(i)) {
sum += i;
}
}
return sum;
}
int main() {
int m, n, p;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for (p = m; p <= n; p++) {
if (prime(p) != 0)
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));
return 0;
}
C++:
#include <iostream>
#include <cmath>
using namespace std;
// 判断是否是素数的函数
bool prime(int p) {
if (p < 2) return false;
if (p == 2) return true;
if (p % 2 == 0) return false;
int sqrtP = (int)sqrt(p);
for (int i = 3; i <= sqrtP; i += 2) {
if (p % i == 0) return false;
}
return true;
}
// 计算m到n之间所有素数的和
int PrimeSum(int m, int n) {
int sum = 0;
for (int i = m; i <= n; i++) {
if (prime(i)) {
sum += i;
}
}
return sum;
}
int main() {
int m, n;
cin >> m >> n;
cout << "Sum of ( ";
for (int p = m; p <= n; p++) {
if (prime(p))
cout << p << " ";
}
cout << ") = " << PrimeSum(m, n) << endl;
return 0;
}
通过上述代码,我们实现了题目的要求,首先判断了一个数是否为素数,然后计算了给定区间内所有素数的和。
总结:
从这道题中,我们可以学习到以下几点:
1. **基础算法的应用**:这道题让我们用到了判断素数的基本算法。对于初学者来说,了解如何判断一个数是否是素数是很重要的。
2. **数学原理**:
- 了解素数的定义。
- 理解为什么判断一个数是否为素数时,只需要检查它不能被2到其平方根之间的任何数整除。
3. **代码的优化与效率**:直观的判断素数的方法是检查一个数是否能被2到它自己的前一个数整除。但这是非常低效的。通过这个题目,我们学到了一个更高效的方法:只需检查到它的平方根。
4. **函数的使用和设计**:通过这个题目,我们学习了如何设计和使用函数来解决一个问题。我们首先设计了一个判断素数的函数,然后设计了一个计算给定区间内所有素数之和的函数。
5. **程序的结构和逻辑**:编写清晰、有结构的代码是很重要的。通过这道题,我们可以看到如何将问题分解为小的、可管理的部分,并通过函数来实现每一部分。
6. **实践输入输出**:这道题也提供了一个机会来实践如何从用户接收输入以及如何格式化输出。
总的来说,这道题目不仅提供了对素数算法的基础认识,还强调了函数、逻辑结构和I/O的重要性,是一个综合性的练习。