欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1942:【08NOIP普及组】ISBN号码 | OpenJudge NOI 1.7 29:ISBN号码 | 洛谷 P1055 [NOIP2008 普及组] ISBN 号码

发布时间:2025/3/17 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 信息学奥赛一本通 1942:【08NOIP普及组】ISBN号码 | OpenJudge NOI 1.7 29:ISBN号码 | 洛谷 P1055 [NOIP2008 普及组] ISBN 号码 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【题目链接】

ybt 1942:【08NOIP普及组】ISBN号码
OpenJudge NOI 1.7 29:ISBN号码
洛谷 P1055 [NOIP2008 普及组] ISBN 号码

【题目考点】

1. 字符串

【解题思路】

整个字符串长度为len,最后识别码的下标为len-1。i从0遍历到len-2,只要不是’-’,那么就将该位置的数字乘以一个不断变大的数字p而后加和。
根据加和求出识别码。
判断求出的识别码和原识别码是否相同,相同则输出"Right",不同则替换原识别码,而后输出。

【题解代码】

解法1:使用字符数组

#include<bits/stdc++.h> using namespace std; int main() {char s[20], cr;//cr:经过计算得到的正确的识别码 cin >> s;int len = strlen(s), p = 1, sum = 0;//p:每次乘的数字,第一次乘1,第二次乘2... for(int i = 0; i < len - 1; ++i)//从下标0遍历到识别码前面的位置 {if(s[i] != '-'){sum += p * (s[i] - '0');p++;}}if(sum % 11 == 10)cr = 'X';elsecr = '0' + sum % 11; if(s[len-1] == cr)//如果正确的识别码和原识别码相同 cout << "Right";else {s[len-1] = cr;//替换识别码 cout << s;}return 0; }

解法2:使用string类

#include<bits/stdc++.h> using namespace std; int main() {string s; char r, cr;//r:原识别码 cr:经过计算得到的正确的识别码 int p = 1, sum = 0;//p:每次乘的数字,第一次乘1,第二次乘2... cin >> s;r = s.back(), s.pop_back();//取出并去掉末尾识别码 for(int i = 0; i < s.length(); ++i)//遍历到识别码前面的位置 if(s[i] != '-')sum += p++ * (s[i] - '0');cr = sum % 11 == 10 ? 'X' : '0' + sum % 11;if(r == cr)//如果正确的识别码和原识别码相同 cout << "Right";else {s.push_back(cr);//添加识别码cout << s;}return 0; }

总结

以上是生活随笔为你收集整理的信息学奥赛一本通 1942:【08NOIP普及组】ISBN号码 | OpenJudge NOI 1.7 29:ISBN号码 | 洛谷 P1055 [NOIP2008 普及组] ISBN 号码的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。