ISBN码(关于atoi和itoa)

我现在感觉很难受,被一个题弄得死去活来,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;}}
}

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/86664018