鱼C论坛

 找回密码
 立即注册
查看: 1702|回复: 2

[已解决]查找两个数之间素数,求大佬帮忙

[复制链接]
发表于 2023-3-16 13:27:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目前问题:有两个值输出不对,
本题目要求读入2个正整数a和b(设输入能保证b>a),如果a、b都是素数,则输出闭区间[a,b]内的所有素数并求平均值;否则,输出闭区间[a,b]之内的所有5的倍数。
测试用例:17 31
结果:17,19,23,29,31,ave=23.8
#include<stdio.h>
#include<math.h>
int main(){
    int a,b,zhi;
    int flag = 0;
    double sum,count;
    scanf("%d%d",&a,&b);
    if(a>b){
        return 0;
    }
//判断a,b是否为素数
    for(int i = 2,j = 2 ;i <= sqrt(a)|| j <= sqrt(b);i ++, j ++){
        if(a % i == 0 || b % j == 0){
        flag = 1;
        break;
            }
        }
//如果素数a,b是素数按照规则输出
        if(flag == 1){
                for(int i = a % 5 + 1; zhi <= b; i++){
                        zhi = i * 5;
                        printf("%d" , zhi);
                        return 0;
                }
        }
//如果不是则判断两数之间哪些是素数
        if(flag != 1){
            for(int i = a; i <= b; i ++){
                for(int k = 2 ; k  <= sqrt(i) ;k++){
                        if(i % k == 0){//如果i不是素数
                                break;
                        }
                    else{//否则i是素数
                    count ++;
                    sum += i ;
                    printf("%d,",i);
                    }
                    break;
                }
            }
            printf("ave=%.1lf",sum/count);
        }
       return 0;
}
最佳答案
2023-3-16 13:36:50
根据你的描述和代码,我发现了两个问题:

1、你的代码在判断a和b是否为素数时,判断条件有误。
2、你的代码在输出5的倍数时,没有正确处理输出格式和范围。
我对你的代码进行了修改,如下:
#include <stdio.h>
#include <math.h>

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

int main() {
    int a, b;
    double sum = 0, count = 0;
    scanf("%d%d", &a, &b);
    if (a > b) {
        return 0;
    }
    
    if (is_prime(a) && is_prime(b)) {
        for (int i = a; i <= b; i++) {
            if (is_prime(i)) {
                count++;
                sum += i;
                printf("%d", i);
                if (i != b) {
                    printf(",");
                }
            }
        }
        printf("ave=%.1lf", sum / count);
    } else {
        for (int i = a; i <= b; i++) {
            if (i % 5 == 0) {
                printf("%d", i);
                if (i + 5 <= b) {
                    printf(",");
                }
            }
        }
    }
    return 0;
}

主要改动:

1、添加了一个is_prime()函数,用于判断输入的整数是否为素数。
2、修改了在a和b都为素数时,输出闭区间[a,b]内的所有素数的逻辑。
3、修改了在a和b不都为素数时,输出闭区间[a,b]内的所有5的倍数的逻辑。
现在,对于测试用例17 31,代码将输出:
17,19,23,29,31,ave=23.8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-16 13:36:50 | 显示全部楼层    本楼为最佳答案   
根据你的描述和代码,我发现了两个问题:

1、你的代码在判断a和b是否为素数时,判断条件有误。
2、你的代码在输出5的倍数时,没有正确处理输出格式和范围。
我对你的代码进行了修改,如下:
#include <stdio.h>
#include <math.h>

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

int main() {
    int a, b;
    double sum = 0, count = 0;
    scanf("%d%d", &a, &b);
    if (a > b) {
        return 0;
    }
    
    if (is_prime(a) && is_prime(b)) {
        for (int i = a; i <= b; i++) {
            if (is_prime(i)) {
                count++;
                sum += i;
                printf("%d", i);
                if (i != b) {
                    printf(",");
                }
            }
        }
        printf("ave=%.1lf", sum / count);
    } else {
        for (int i = a; i <= b; i++) {
            if (i % 5 == 0) {
                printf("%d", i);
                if (i + 5 <= b) {
                    printf(",");
                }
            }
        }
    }
    return 0;
}

主要改动:

1、添加了一个is_prime()函数,用于判断输入的整数是否为素数。
2、修改了在a和b都为素数时,输出闭区间[a,b]内的所有素数的逻辑。
3、修改了在a和b不都为素数时,输出闭区间[a,b]内的所有5的倍数的逻辑。
现在,对于测试用例17 31,代码将输出:
17,19,23,29,31,ave=23.8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-16 22:20:40 | 显示全部楼层
#include <stdio.h>
#include <math.h>

int isPrime(int num) {
        if (!(num & 1) && num != 2) return 0;
        for (int n = 2; n < sqrt((float)num) + 1; ++n) {
                if (!(num % n)) return 0;
        }
        return 1;
}

int main(void) {
        int a, b; // a < b
        scanf("%d%d", &a, &b);
        if (isPrime(a) && isPrime(b)) {
                for (int num = a; num <= b; ++num) {
                        if (isPrime(num)) {
                                printf("%d ", num);
                        }
                }
        }
        else {
                for (int num = 1; num <= b; ++num) {
                        if (!(num % 5)) {
                                printf("%d ", num);
                        }
                }
        }
        return 0;
}
123 158
5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150 155
13 97
13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 17:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表