初莫M 发表于 2023-9-30 15:45:29

代码问题出在哪了啊

题目
《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲,来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点,多耗一些智商。
不妨设游戏中的两个人为 A 和 B。游戏开始后,两人同时报出两个整数 N
A

和 N
B

。判断谁是爹的标准如下:

将两个整数的各位数字分别相加,得到两个和 S
A

和 S
B

。如果 N
A

正好是 S
B

的整数倍,则 A 是爹;如果 N
B

正好是 S
A

的整数倍,则 B 是爹;
如果两人同时满足、或同时不满足上述判定条件,则原始数字大的那个是爹。
本题就请你写一个自动裁判程序,判定谁是爹。
输入格式:
输入第一行给出一个正整数 N(≤100),为游戏的次数。以下 N 行,每行给出一对不超过 9 位数的正整数,对应 A 和 B 给出的原始数字。题目保证两个数字不相等。

输出格式:
对每一轮游戏,在一行中给出赢得“爹”称号的玩家(A 或 B)。
我的代码是
#include<stdio.h>
int main()
{
        int a,b,n;
        scanf("%d",&n);
        while(n>0)
        {
                scanf("%d%d",&a,&b);
                int c,sa=0,sb=0;
                for(;a>0;)
                {
                        c=a%10;
                        a=a/10;
                        sa=sa+c;
                }
                for(;b>0;)
                {
                        c=b%10;
                        b=b/10;
                        sb=sb+c;
                }
                if(sb%a==0&&sa%b!=0) printf("B\n");
                if(sb%a!=0&&sa%b==0) printf("A\n");
                if(sb%a==0&&sa%b==0)
                {
                        if(a>b)printf("A\n");
                        if(a<b)printf("B\n");
                }
                if(sb%a!=0&&sa%b!=0)
                {
                        if(a>b)printf("A\n");
                        if(a<b)printf("B\n");
                }
                n--;
        }
}

isdkz 发表于 2023-9-30 15:45:41

代码问题在于第7行,应该将a和b的和作为判断条件,而不是a和b本身。

具体来说,应该将第7行改为:

int sa=0,sb=0;
int ta=a, tb=b;
while(ta>0) {
    sa += ta % 10;
    ta /= 10;
}
while(tb>0) {
    sb += tb % 10;
    tb /= 10;
}
if(sb%sa==0&&sa%sb!=0) printf("B\n");
if(sb%sa!=0&&sa%sb==0) printf("A\n");
if(sb%sa==0&&sa%sb==0) {
    if(a>b)printf("A\n");
    if(a<b)printf("B\n");
}
if(sb%sa!=0&&sa%sb!=0) {
    if(a>b)printf("A\n");
    if(a<b)printf("B\n");
}


解释一下:

我们需要计算出a和b的各位数字之和,因此需要新定义两个变量ta和tb来保存a和b的值,以免改变原值。

然后分别对ta和tb进行循环,每次取出个位数字,加到sa和sb中,然后将ta和tb分别除以10,以便取下一位数字。

最后判断条件中,将a和b的位置颠倒,判断sb%sa==0&&sa%sb!=0是否成立即可。

Mike_python小 发表于 2023-9-30 15:46:14

本帖最后由 Mike_python小 于 2023-9-30 12:49 编辑

你的代码存在几个问题:

1. 在第一个判断条件 `if(sb%a==0&&sa%b!=0)` 和第二个判断条件 `if(sb%a!=0&&sa%b==0)` 中,你使用了 `a` 和 `b` 的值进行计算。然而,在计算 `sb` 和 `sa` 的过程中,你已经改变了 `a` 和 `b` 的值,因此这里使用 `a` 和 `b` 来判断是不正确的。你应该使用最初输入的 `a` 和 `b` 的原始值来判断。

2. 在判断条件 `if(sb%a==0&&sa%b==0)` 和 `if(sb%a!=0&&sa%b!=0)` 中,你使用了 `a` 和 `b` 进行比较。然而,题目要求是比较原始数字的大小,而不是比较经过位数相加后的值。你应该使用最初输入的 `a` 和 `b` 的原始值来比较。

3. 在对输入次数 `n` 进行循环时,你忽略了 `n` 的取值范围,可能会导致超出数组范围的错误。

以下是修复上述问题的代码示例:


#include <stdio.h>

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

    while (n > 0) {
      int a, b, original_a, original_b;
      scanf("%d%d", &a, &b);
      original_a = a;
      original_b = b;
      
      int sa = 0, sb = 0;
      while (a > 0) {
            int c = a % 10;
            a = a / 10;
            sa = sa + c;
      }
      
      while (b > 0) {
            int c = b % 10;
            b = b / 10;
            sb = sb + c;
      }
      
      if (sb % original_a == 0 && sa % original_b != 0) {
            printf("B\n");
      } else if (sb % original_a != 0 && sa % original_b == 0) {
            printf("A\n");
      } else {
            if (original_a > original_b)
                printf("A\n");
            else
                printf("B\n");
      }
      
      n--;
    }

    return 0;
}


求一个最佳答案谢谢啦!

陶远航 发表于 2023-9-30 15:48:06

在你的代码中,存在一些问题:

1. 在判断谁是爹的条件中,应该是 NA 是 SB 的整数倍,而不是 NB 是 SA 的整数倍。修改为 if (NA % SB == 0 && SA % NB != 0)。

2. 当两人同时满足或同时不满足上述判定条件时,应该是原始数字大的那个是爹。修改为 else if (SA == SB || (SA % NB != 0 && SB % NA != 0))。

3. 在输出父亲的时候,应该输出大写字母 'A' 或 'B',而不是小写字母 'a' 或 'b'。修改为 printf("A\n") 或 printf("B\n")。

4. scanf("%d", &n); 后应加一个换行符 \n,即 scanf("%d\n", &n);,这样可以避免读取这个整数后的回车符干扰后面的输入。

修改后的代码如下:

#include <stdio.h>

int main() {
    int a, b, n;
    scanf("%d\n", &n);
    while (n > 0) {
      scanf("%d %d", &a, &b);
      int c, sa = 0, sb = 0;
      while (a > 0) {
            c = a % 10;
            a = a / 10;
            sa = sa + c;
      }
      while (b > 0) {
            c = b % 10;
            b = b / 10;
            sb = sb + c;
      }
      if (sb % a == 0 && sa % b != 0)
            printf("B\n");
      else if (sb % a != 0 && sa % b == 0)
            printf("A\n");
      else if (sb % a == 0 && sa % b == 0) {
            if (a > b)
                printf("A\n");
            else
                printf("B\n");
      } else if (sb % a != 0 && sa % b != 0) {
            if (a > b)
                printf("A\n");
            else
                printf("B\n");
      }
      n--;
    }
    return 0;
}


在修改后的代码中,我们根据题目要求对判断条件进行了修正,并通过输出大写字母 'A' 或 'B' 来表示谁是爹。同时,添加了读取整数后的换行符处理,保证输入的正确性。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 代码问题出在哪了啊