1 条题解
-
0
[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