6-2 使用函数求素数和

 

分数 20

全屏浏览题目

切换布局

作者 张高燕

单位 浙大城市学院

本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:

 

int prime( int p ); int PrimeSum( int m, int n );

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[mn]内所有素数的和。题目保证用户传入的参数mn

裁判测试程序样例:

 

#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

我的答案:

分析过程

这道题目要求判断一个数是否是素数并计算给定范围内所有素数的和。所以我们首先需要一个函数来判断一个数是否是素数,然后用另一个函数来计算素数的和。

  1. 判断素数

    • 所有小于2的整数都不是素数。
    • 2是最小的素数。
    • 对于大于2的数,如果它有一个小于或等于它平方根的因子,那么它就不是素数。
  2. 计算素数和

    • 遍历m到n之间的所有整数,使用prime函数判断每个数是否是素数。如果是,就累加到总和中。

解题过程

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的重要性,是一个综合性的练习。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值