1 条题解

  • 0
    @ 2026-10-18 21:31:54

    [NOIP 2008 普及组] ISBN 号码

    知识点

    字符串、校验码、模运算

    解题思路

    跳过连字符,对前9个数字依次乘1到9后求和,取模11。余数为10对应X,否则对应数字字符。与原识别码相同则输出Right,否则替换末字符。

    正确性说明

    计算完全对应ISBN校验规则,前9位与分隔符保持原样,仅校验位由唯一余数确定,因此得到的结果符合要求。

    易错点

    X是大写;连字符不参与权重编号;原码正确时输出Right而不是再输出ISBN。

    复杂度

    时间O(|s|),额外空间O(1)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        string s;cin>>s;int sum=0,w=1;
        for(int i=0;i+1<(int)s.size();++i) if(isdigit((unsigned char)s[i])) sum+=(s[i]-'0')*w++;
        int r=sum%11;char check=r==10?'X':char('0'+r);
        if(s.back()==check) cout<<"Right\n";
        else{s.back()=check;cout<<s<<'\n';}
    }
    
    • 1

    信息

    ID
    47
    时间
    1000ms
    内存
    256MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者