mooc前几周还好,第五周求素数和突然就不会做了?

img


这里找了其他答案但是根本看不懂,自己上手写的全是bug,我想着先把第m和第n个素数求出来然后求这个区间的素数和,但一直报错

可以使用循环实现。

代码如下:


#include <stdio.h>
#include <math.h>

// 判断参数n是否为素数,返回1表示是素数,返回0表示不是素数 
int findPrime(int n){
    
    if(n<2){
        return 0;
    }
    
    //  因为 如果 2到  (int)sqrt(n) 区间的数 如果可以整除 n,
    // 则 其 商 必是在  (int)sqrt(n) 到 n-1之间,
    // 所以判断了前半部分,后半部分 就不需要再判断了,这样可以减少运算次数 
    for(int i=2;i<=(int)sqrt(n);i++){
        
        if(n%i==0){
            return 0;
        }
    }
    
    return 1;
    
} 

int main(void){
    
    int n,m;
    int i=0;  // 素数个数计数器,初始为0 
    int num=2;  // 从第2开始计算 
    int sum=0;  // 存储区间素数和的变量,初始为0
    
    // 从输入获取n和m的值 
    scanf("%d%d",&n,&m);
    
    // 循环查找第n和第m个素数 
    while(i<m){
        
        if(findPrime(num)==1){  // 如果当前的数是素数 
            i++;  // 则素数计数器+1 
            if(i>=n&&i<=m){  // 如果是第n个和第m个之间的素数,则将当前的数累加到和sum中 
                sum+=num;
            }
        }
            
        num++;  // 下次判断 num的下一个整数 
                
    }
    
    // 打印结果 
    printf("%d",sum);
    
    return 0;
    
}

img

【以下回答由 GPT 生成】

首先,我们需要解决一些问题来解决这个问题。

第一个问题是如何判断一个数是否是素数。我们可以使用一个辅助函数is_prime()来判断一个数是否是素数。以下是这个函数的实现:

int is_prime(int num) {
    if (num < 2) {
        return 0;
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {
            return 0;
        }
    }
    return 1;
}

这个函数首先检查数字是否小于2,因为2是最小的素数。然后它使用一个循环从2到平方根(num)来检查num是否可以被除以任何小于或等于它的数整除。如果可以,它返回0,否则返回1。

接下来,我们需要解决如何找到第n个素数到第m个素数并计算它们的和。我们可以使用一个辅助函数sum_of_primes()来找到并计算这个和。以下是这个函数的实现:

int sum_of_primes(int n, int m) {
    int count = 0;
    int sum = 0;
    int num = 2; // 从2开始找素数

    while (count < m) {
        if (is_prime(num)) {
            count++;
            if (count >= n) {
                sum += num;
            }
        }
        num++;
    }

    return sum;
}

这个函数使用两个变量countsum来跟踪素数的数量和它们的总和。它使用一个循环从2开始逐个检查每个数字,直到找到了第m个素数。对于每个素数,它会增加计数器值并检查是否达到了n的值。如果计数器的值大于或等于n,它将将素数添加到总和中。最后,函数返回总和。

现在,我们可以在主函数中使用这两个辅助函数来解决问题。以下是一个示例代码:

#include <stdio.h>
#include <math.h>

int is_prime(int num) {
    if (num < 2) {
        return 0;
    }
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {
            return 0;
        }
    }
    return 1;
}

int sum_of_primes(int n, int m) {
    int count = 0;
    int sum = 0;
    int num = 2; // 从2开始找素数

    while (count < m) {
        if (is_prime(num)) {
            count++;
            if (count >= n) {
                sum += num;
            }
        }
        num++;
    }

    return sum;
}

int main() {
    int n, m;

    printf("请输入n的值(0 < n <= m <= 200):");
    scanf("%d", &n);

    printf("请输入m的值(0 < n <= m <= 200):");
    scanf("%d", &m);

    int sum = sum_of_primes(n, m);

    printf("第%d个素数到第%d个素数之间所有素数的和为:%d\n", n, m, sum);

    return 0;
}

以上代码中,我们先在主函数中读取用户输入的n和m的值。然后,我们调用sum_of_primes()函数来计算第n个素数到第m个素数之间所有素数的和,并将结果打印出来。

这就是解决这个问题的步骤。如果你还有其他问题,请告诉我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^