#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;
}
// 如果B是A的各位数字之和 的整数倍,则标记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;
}
// 如果A是B的各位数字之和的整数倍,则标记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");
}
}
}
}
【以下回答由 GPT 生成】
这段代码有几个地方需要做一些修正:
在声明 int NA[N]
和 int NB[N]
之前,需要先将 N
改为一个具体的值,或者使用动态内存分配函数(如 malloc
)为这两个数组分配内存空间。在 C 语言中,数组的长度必须是一个常量。
在第一个 scanf
语句中,不需要加上 \n
,因为换行符在这个上下文中是多余的。
将 scanf("%d %d\n", &NA[i], &NB[i]);
中的 \n
改为一个空格,否则可能导致读取到的 NB[i]
值不正确。
在计算数字各位之和的循环时,需要添加一个额外的条件,即 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;
}
希望这些修改可以修复你的代码问题。如果有其他问题,请随时提问。
【相关推荐】