我现在感觉很难受,被一个题弄得死去活来,md,我忍不住想吐槽一下,细节做得真足,我硬生生看着数据把题目A对,也怪我自己(QAQ),没认真审清题目就开始做题。话不多说,题目如下:
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
收起
输入
输入文件只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出
输出文件共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
输入样例
0-670-82162-0
输出样例
0-670-82162-4
这题我个人感觉(按我做得角度)主要靠两个字符串库函数atoi和itoa,我以前只是大致了解他的作用,但也不会用,关于atoi的用法如下:
int atoi(char *s); 将字符串s里的内容转换成一个整型数返回。比如,如果字符串s的内容是“1234”,那 么函数返回值就是1234。如果s格式不是一个整数,比如是"a12",那么返回0。
把下面的代码看懂差不多就会用了
#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define ll long long
int main()
{
char c[10];c[1]='\0';
char b;
cin>>b;//输入一个数字
c[0]=b;
char *a=c;//字符数组‘模拟’字符串
int num=atoi(a);//atoi里必须是存放着字符串的指针(数组名)
cout<<num*5;//输出也是数字哦
}
关于itoa的用法如下
char *itoa(int value, char *string, int radix); 将整型值value以radix进制表示法写入 string:
char szValue[20];
itoa( 27,szValue,10); //使得szValue的内容变为 "27"
itoa( 27,szValue,16); //使得szValue的内容变为"1b"
了解上述函数,是不是感觉很强大,回归问题,注意余数为10是‘X’就可以了
代码如下(由于是生凑得代码,显得凌乱,多多见谅,用空在整理)
#include<bits/stdc++.h>
#include<iostream>
#include<set>
#include<cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define ll long long
int main()
{
char c[10];
string s;c[1]='\0';
cin>>s;ll l=s.size();ll sum=0,k=1;
for(ll i=0;i<l-1;i++)
{
if((s[i]>='0'&&s[i]<='9')||(s[i]=='X')) {if(s[i]=='X') {itoa(10,c,10),s[i]=c[0];}c[0]=s[i];char *f=c;sum+=atoi(f)*k;k++;}
}
c[0]=s[l-1];char *p=c;ll ans=atoi(p);
if(sum%11==10) {if(s[l-1]=='X') {cout<<"Right";return 0;}}
if(sum%11==ans) cout<<"Right";
else {if(sum%11==10) s[l-1]='X',cout<<s;
else {itoa(sum%11,c,10);s[l-1]=c[0],cout<<s;}}
}