[NOIP 2008 普及组] ISBN 号码 · 教师题解

[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';}
}
返回题目