C语言 首先定义求给定范围内素数的函数,以给定数的上、下界为形参,函数内定义数组存放素数,并作为返回值;然后在主函数调用该函数并求和。其中可以单独定义判断素数的函数。 (2)编程思路 ①定义类型为整型指针(数组)int *的被调函数primeNum, 以给定数的上、下界为形参. ②在被调函数中定义整型数组变量aNum存放素数,注意需要在数组中保存素数的个数,可以在aNum[0]保存素数的个数,从aNum[1]开始保存素数 ③求指定范围的素数及其个数,存放在数组aNum中,并返回该数组 ④在主函数中定义整型指针(数组)变量,调用函数primeNum。 ⑤求和
时间: 2025-03-11 16:28:13 浏览: 67
### 实现思路
为了完成这一任务,程序结构应分为两部分:一是定义用于判断单个数是否为素数的辅助函数 `is_prime`;二是主函数负责遍历指定范围内的所有整数,并调用该辅助函数筛选出所有的素数,同时累加这些素数得到总和。
#### 辅助函数 `is_prime`
此函数接收一个整型参数 n ,返回布尔值表示输入是否为素数。对于小于等于1的情况直接返回false,因为1既不是质数也不是合数[^1]。对于大于1的情形,则尝试除以从2至根号下n之间的所有自然数(优化后的算法),只要存在能被整除的情况即刻返回false表明非素数,否则最终返回true说明是素数[^2]。
```c
#include <stdbool.h>
#include <math.h>
bool is_prime(int num){
if(num <= 1) return false;
int limit = sqrt((double)num);
for(int i = 2; i <= limit ; ++i){
if( num % i == 0 ) return false;
}
return true;
}
```
#### 主函数逻辑设计
在主函数中,先读取用户输入的两个边界 m 和 n 。接着创建动态分配内存的空间用来保存找到的所有素数,并初始化计数器 count 记录实际发现了多少个素数以及变量 sum 来累积求和。利用for循环迭代整个[m,n]闭区间中的每一个数值,每当遇到一个新的素数时便将其加入到预先准备好的数组里并更新sum 的值。最后打印输出结果前记得释放之前申请过的堆空间以免造成资源泄漏[^3]。
```c
#define MAX_PRIMES 1000 // 假设最多可能有这么多素数存在于给定范围内
int main(){
int m, n;
printf("Enter the range (start end): ");
scanf("%d%d", &m, &n);
int *primes = malloc(MAX_PRIMES * sizeof(*primes));
if (!primes) {
fprintf(stderr,"Memory allocation failed\n");
exit(EXIT_FAILURE);
}
size_t prime_count = 0;
long sum_of_primes = 0;
for(int current_num=m;current_num<=n;++current_num){
if(is_prime(current_num)){
primes[prime_count++] = current_num;
sum_of_primes += current_num;
}
}
printf("Primes between %d and %d are:\n", m, n);
for(size_t idx=0;idx<prime_count;++idx){
printf("%d ", primes[idx]);
}
printf("\nTheir sum equals to:%ld\n", sum_of_primes);
free(primes); // 清理不再使用的内存区域
return EXIT_SUCCESS;
}
```
阅读全文
相关推荐
















