代码问题出在哪了啊
题目《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲,来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点,多耗一些智商。
不妨设游戏中的两个人为 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--;
}
} 代码问题在于第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 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;
}
求一个最佳答案谢谢啦! 在你的代码中,存在一些问题:
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]