daydreamerw 2019-11-14 13:26 采纳率: 0%
浏览 131

HDU 2098分拆素数和 输出的数字不对 和网上进行了比对没找到问题在哪,求大神帮忙解答一下

#include<stdio.h>
#include<math.h>
int isPrime(int n){
    int i;
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0){
            return 0;
    }
    return 1;
    }
} 
int main()
{
    int n,i,j;
    int cnt;
    for(i=0;i<500;i++){

        scanf("%d",&n);
        cnt=0;
        if(n>10000||n<0){
            break;
        }
        if(n==0){
            break;
        }
        for(j=3;j<n/2;j+=2){

        if(isPrime(j)&&isPrime(n-j)){

            cnt++;  
        }
    }   
printf("%d\n",cnt);     //cnt的输出不正确
}   

    return 0;
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 17:50
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你的代码有一些小错误。首先,你需要使用#include <stdbool.h>来包含bool类型。其次,在for循环中,你没有处理输入值为负的情况。此外,你可以在循环内部检查j是否是素数,并在满足条件时更新cnt

    修复后的代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define MAX 10000
    
    void check_prime(int num) {
        if (num <= 1)
            return;
    
        if (num == 2)
            return;
    
        if (num % 2 == 0)
            return;
    
        for (int i = 3; i * i <= num; i += 2) {
            if (num % i == 0)
                return;
        }
    
        printf("Prime number\n");
    }
    
    int main() {
        int n, i, j, cnt;
        bool prime[MAX + 1] = {false};
    
        scanf("%d", &n);
    
        if (n > MAX || n < 0) {
            printf("Invalid input.\n");
            return 0;
        }
    
        for (i = 3; i <= n / 2; i += 2) {
            if (prime[i]) {
                continue;
            }
    
            if (n % i == 0) {
                check_prime(i);
                break;
            }
    
            if (n % (i + 2) == 0) {
                check_prime(i + 2);
                break;
            }
    
            if (i * i >= n) {
                check_prime(i);
            }
        }
    
        cnt = 0;
        for (j = 3; j <= n; j += 2) {
            if (!prime[j]) {
                cnt++;
            }
        }
    
        printf("%d\n", cnt);
    
        return 0;
    }
    

    这个修改过的版本应该可以解决你的问题。注意,我添加了一个check_prime函数,用于检查一个数是否是素数,并且我将数组大小设置为MAX + 1以避免溢出。

    评论

报告相同问题?