0
点赞
收藏
分享

微信扫一扫

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

Android开发指南 2022-02-28 阅读 127
c++字符串

【题目链接】

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';
	else
		cr = '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;
}
举报

相关推荐

0 条评论