这是哪里错了?只有50分

P1055 [NOIP2008 普及组] ISBN 号码

super_D @ 2024-10-06 14:04:49

#include <stdio.h>
int if_X(char c)
{
    int i;
    if(c=='X') i=10;
    else i=c-48;
    return i;
}
int main()
{
    char c_ISBN[13];
    scanf("%s",&c_ISBN);
    int i_ISBN[10],cnt=0,label=0;
    for(int i=0;i<11;i++)
    {
        if(c_ISBN[i]=='-')
        {
            cnt++;
            continue;
        }
        else i_ISBN[i-cnt]=(c_ISBN[i]-48)*(i-cnt+1);
    }
    i_ISBN[9]=if_X(c_ISBN[12]);
    for(int j=0;j<9;j++) label+=i_ISBN[j];
    if(label%11==i_ISBN[9]) puts("Right");
    else
    {
        c_ISBN[12]=0x30+label%11;
        puts(c_ISBN);
    }
}

by super_D @ 2024-10-06 14:05:31

运行结果都没问题呀


by xzh15960292751 @ 2024-10-06 14:12:41

@li_duter

/*ISBN 号码*/
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char s[14],c;
    cin >> s;
    int sum = 0,k = 0;
    for(int i=0; i<11; i++) {
        if(s[i] != '-') {
            k++;
            sum += k * (s[i] - '0'); //-0是为了将字符串变成普通数字
        }
    }
    sum %= 11;
    if(sum == 10) c = 'X';
    else c = sum + '0';
    if(c == s[12]) cout << "Right" << endl;
    else {
        s[12]=c;
        cout << s;
    }
    return 0;
}

by xzh15960292751 @ 2024-10-06 14:30:19

@li_duter 以下是用你的代码修改的:

字符数组初始化问题:

char c_ISBN[13];
只分配了13个字符的空间,但你的输
入可能是13个字符(包括结尾
的'\0'),所以可能会导致数组越
界。建议将数组大小改为 14。

字符转换为数字的方式:

在 if_X 函数中,你将字符 X 转换为
数字 10,但没有处理其他字符的情
况。应该确保所有字符都能正确转换
为数字。

识别码计算错误:

在计算识别码时,你需要确保所有数
字都被正确处理,并且在最后一步中
正确计算余数。

输出正确的 ISBN 号码:

当识别码不正确时,你需要输出完整
的 ISBN 号码,包括分隔符 -。

以下是修正后的代码:

#include <stdio.h>
int if_X(char c)
{
    if(c == 'X') return 10;
    else return c - '0';
}
int main()
{
    char c_ISBN[14]; // 增加一个字符空间以容纳结束符
    scanf("%s", c_ISBN);
    int i_ISBN[10], cnt = 0, label = 0;
    for(int i = 0; i < 12; i++) // 处理前12个字符
    {
        if(c_ISBN[i] == '-')
        {
            cnt++;
            continue;
        }
        else
            i_ISBN[i - cnt] = (c_ISBN[i] - '0') * (i - cnt + 1); // 使用 '0' 而不是 48
    }
    i_ISBN[9] = if_X(c_ISBN[12]); // 处理识别码
    for(int j = 0; j < 9; j++) label += i_ISBN[j];
    if(label % 11 == i_ISBN[9]) puts("Right");
    else
    {
        char ch;
        int mod_number = label % 11;
        if (mod_number == 10) ch = 'X';
        else ch = '0' + mod_number;

        c_ISBN[12] = ch;
        puts(c_ISBN);
    }
    return 0;
}

主要修正点:

通过这些修正,你的程序应该能够正确处理所有输入,并输出正确的结果。


|