鱼C论坛

 找回密码
 立即注册
查看: 1398|回复: 3

[已解决]代码问题出在哪了啊

[复制链接]
发表于 2023-9-30 15:45:29 | 显示全部楼层 |阅读模式

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

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

x
题目
《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲,来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点,多耗一些智商。
不妨设游戏中的两个人为 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--;
        }
}
最佳答案
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是否成立即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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是否成立即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
求一个最佳答案谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 15:48:06 | 显示全部楼层
在你的代码中,存在一些问题:

1. 在判断谁是爹的条件中,应该是 NASB 的整数倍,而不是 NBSA 的整数倍。修改为 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' 来表示谁是爹。同时,添加了读取整数后的换行符处理,保证输入的正确性。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 22:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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