• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Niro Einteson
文可提笔安天下 武可上马定乾坤
博客园    首页    新随笔    联系   管理    订阅  订阅

P1055 ISBN号码

P1055 ISBN号码


题目描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果 mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9再求和,即0×1+6×2+……+2×9=158然后取158mod11的结果4作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。

输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。

输入输出样例
输入
0-670-82162-4
输出
Right
输入
0-670-82162-0
输出
0-670-82162-4
说明/提示
2008普及组第一题

 

 1 解法:
 2 
 3 #include<bits/stdc++.h>
 4 using namespace std;
 5 int main()
 6 {
 7     /*思路:
 8         1:对字符遍历,若不是'-'和 最后 一个字符,就可计算和
 9         2:计算出的sum%11,然后看取余之后的数 是否是10,是10,要判断出X
10         3:最后比较最后一位 字符,看是否一样,不一样,输出正确的,替换掉最后一个字符
11     */
12     string str;
13     cin>>str;
14     int cnt=1;
15     int sum=0;
16     for(int i=0;i<(int)str.size()-1;i++){
17         if(str[i]!='-'){//只要不是 '-',就可以 计算数
18             sum+=(str[i]-'0')*cnt;//总和 加数乘以基数,基数在变
19             cnt++;//乘数1,2,3,4..9
20         }
21     }
22     char modelNum;
23     if(sum%11==10){
24         modelNum='X';
25     }else modelNum=sum%11+'0';
26 
27     if(str[str.size()-1]==modelNum)//如果最后一个字符和取余的数一样
28         cout<<"Right"<<endl;//输出 Right;
29     else{//否则 将最后 一个不正确的字符 换掉
30         cout<<str.substr(0,str.size()-1)<<modelNum<<endl;
31     }
32     return 0;
33 }

 

posted @ 2019-12-10 19:54  Nirogo  阅读(751)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3