c语言pat基础题改错08131096

img

img


#include<stdio.h>
int main(){
    int N;
    scanf("%d\n",&N);
    int NA[N],NB[N];//记录数组
    int a_sum[N],b_sum[N];//记录各位数字之和
    int flag_a[N],flag_b[N];//如果能整除则标记为1,否则为0
    //扫描数组
    for(int i=0;i<N;i++){
        scanf("%d %d\n",&NA[i],&NB[i]);
    }
    for(int i=0;i<N;i++){
        int t=NA[i];
        a_sum[i]=0;
        flag_a[i]=0;
        for(;t!=0;){
            a_sum[i]+=t%10;
            t/=10;
        }
        if(a_sum[i]!=0&&NA[i]%a_sum[i]==0){
            flag_a[i]=1;
        }
    }
    for(int i=0;i<N;i++){
        int t=NB[i];
        b_sum[i]=0;
        flag_b[i]=0;
        for(;t!=0;){
            b_sum[i]+=t%10;
            t/=10;
        }
        if(b_sum[i]!=0&&NA[i]%b_sum[i]==0){
            flag_b[i]=1;
        }
    }
    for(int i=0;i<N;i++){
        if(flag_a[i]==1&&flag_b[i]==0){
            printf("A\n");
        }else if(flag_b[i]==1&&flag_a[i]==0){
            printf("B\n");
        }else if(flag_a[i]==flag_b[i]){
            if(NA[i]>NB[i]){
                printf("A\n");
            }else{
                printf("B\n");
            }
        }
    }
}

我的代码出现问题,本题希望可以得到大家的指导,谢谢你的帮助!

用数组写,有点绕,不如直接用两个变量写,更清晰,供参考:

#include<stdio.h>
int sum(int x)
{
    if (x == 0) return 0;
    return x % 10 + sum(x / 10);
}
int main()
{
    int n, a, b, sa, sb;
    scanf("%d", &n);
    while (n--)
    {
        scanf("%d %d", &a, &b);
        sa = sum(a);   // 位数求和
        sb = sum(b);   
        if (a % sb == 0 && b % sa == 0)
        {
            if (a > b)
                printf("A");
            else
                printf("B");
        }
        else if (a % sb == 0)
            printf("A");
        else if (b % sa == 0)
            printf("B");
        else{
            if (a > b)
                printf("A");
            else
                printf("B");        
        }
        if (n)  printf("\n");
    }
    return 0;
}

修改如下:



 
 
#include<stdio.h>
int main(){
    int N;
    scanf("%d\n",&N);
    int NA[N],NB[N];//记录数组
    int a_sum[N],b_sum[N];//记录各位数字之和
    int flag_a[N],flag_b[N];//如果能整除则标记为1,否则为0
    //扫描数组
    for(int i=0;i<N;i++){
        scanf("%d %d",&NA[i],&NB[i]);
    }
    for(int i=0;i<N;i++){
        int t=NA[i];
        a_sum[i]=0;
        flag_b[i]=0;  // 标记flag_b[i]初始置1 
        for(;t!=0;){
            a_sum[i]+=t%10;
            t/=10;
        }
        // 如果BA的各位数字之和 的整数倍,则标记flag_b[i]置1 
        if(a_sum[i]!=0&&NB[i]%a_sum[i]==0){
            flag_b[i]=1;
            
        }

    }
    for(int i=0;i<N;i++){
        int t=NB[i];
        b_sum[i]=0;
        flag_a[i]=0; // 标记flag_a[i]初始置1 
        for(;t!=0;){
            b_sum[i]+=t%10;
            t/=10;
        }
        // 如果AB的各位数字之和的整数倍,则标记flag_a[i]置1 
        if(b_sum[i]!=0&&NA[i]%b_sum[i]==0){
            flag_a[i]=1;
           
        }
    
    }

    for(int i=0;i<N;i++){
        if(flag_a[i]==1&&flag_b[i]==0){
            printf("A\n");
        }else if(flag_b[i]==1&&flag_a[i]==0){
            printf("B\n");
        }else if(flag_a[i]==flag_b[i]){
            if(NA[i]>NB[i]){
                printf("A\n");
            }else{
                printf("B\n");
            }
        }
    }
}


img

【以下回答由 GPT 生成】

这段代码有几个地方需要做一些修正:

  1. 在声明 int NA[N]int NB[N] 之前,需要先将 N 改为一个具体的值,或者使用动态内存分配函数(如 malloc)为这两个数组分配内存空间。在 C 语言中,数组的长度必须是一个常量。

  2. 在第一个 scanf 语句中,不需要加上 \n,因为换行符在这个上下文中是多余的。

  3. scanf("%d %d\n", &NA[i], &NB[i]); 中的 \n 改为一个空格,否则可能导致读取到的 NB[i] 值不正确。

  4. 在计算数字各位之和的循环时,需要添加一个额外的条件,即 t != 0,确保能够正确遍历每一位数字。目前的代码中,只有 t 不等于 0 时才会执行循环。

下面是修正后的代码:

#include<stdio.h>

int main() {
    int N;
    scanf("%d", &N);

    // 动态分配内存
    int *NA = malloc(N * sizeof(int));
    int *NB = malloc(N * sizeof(int));
    int *a_sum = malloc(N * sizeof(int));
    int *b_sum = malloc(N * sizeof(int));
    int *flag_a = malloc(N * sizeof(int));
    int *flag_b = malloc(N * sizeof(int));

    for (int i = 0; i < N; i++) {
        scanf("%d %d", &NA[i], &NB[i]);
    }

    for (int i = 0; i < N; i++) {
        int t = NA[i];
        a_sum[i] = 0;
        flag_a[i] = 0;
        while (t != 0) {
            a_sum[i] += t % 10;
            t /= 10;
        }
        if (a_sum[i] != 0 && NA[i] != 0) { // 修改处
            flag_a[i] = 1;
        }
    }

    for (int i = 0; i < N; i++) {
        int t = NB[i];
        b_sum[i] = 0;
        flag_b[i] = 0;
        while (t != 0) {
            b_sum[i] += t % 10;
            t /= 10;
        }
        if (b_sum[i] != 0 && NB[i] != 0) { // 修改处
            flag_b[i] = 1;
        }
    }

    for (int i = 0; i < N; i++) {
        if (flag_a[i] == 1 && flag_b[i] == 0) {
            printf("A\n");
        } else if (flag_b[i] == 1 && flag_a[i] == 0) {
            printf("B\n");
        } else if (flag_a[i] == flag_b[i]) {
            if (NA[i] > NB[i]) {
                printf("A\n");
            } else {
                printf("B\n");
            }
        }
    }

    // 释放内存
    free(NA);
    free(NB);
    free(a_sum);
    free(b_sum);
    free(flag_a);
    free(flag_b);

    return 0;
}

希望这些修改可以修复你的代码问题。如果有其他问题,请随时提问。



【相关推荐】



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