ISBN号码(字符串)

ISBN号码
每一本正式出版的图书都有一个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号码(包括分隔符“-”)。
样例输入
【输入样例1】

0-670-82162-4

【输入样例2】

0-670-82162-0

样例输出
【输出样例1】

Right

【输出样例2】

0-670-82162-4

思路点拔:本题思路很简答,就是简单的字符串操作,首先,我们讲字符串中的数字进行提取,注意:最后一位需要单独处理,因为存在余数是10的情况,最后一位是X,所以,我们就讲提取出来的数字放在一个int类型的数组,然后就算和,就这样简答,废话不多说,上代码!!

#include
#include
#include
using namespace std;
char a[20]; 
int ans[20],l,sum,lena;
int main()
{
    scanf("%s",a);//用%s输入一个字符串
    lena=strlen(a); //渠道长度
    for(int i=0;i1;i++) //提取除了最后一个数字的数字。
    {
        if(a[i]>='0'&&a[i]<='9')
        {
            ans[++l]=a[i]-'0'; //将提取出来的数字存入一个整形数组中
        }
    }
    for(int i=1;i<=l;i++) //求和
    {
        sum+=ans[i]*i;
    }
    int p=sum%11; //取模
    if(p==a[lena-1]-'0'&&a[lena-1]!='X')
     //判断最后一位是否与p相等,注意,此时我们要排除最后一位为x的情况
    {
        printf("Right\n"); //如果相等,就输出Right
    } 
    else if(p==10&&a[lena-1]=='X') //如果p等于10并且最后一位是X,也符合要求,也是输出Right
    {
        printf("Right\n");
    }
    else //否则就说明不满足要求
    {
        for(int i=0;i1;i++) //先原样输出前面的字符
        {
            printf("%c",a[i]);
        }
        if(p==10) //如果p为10,就输出X
        {
            printf("X\n");
        }
        else //否则就输出p就行了
        {
            printf("%d\n",p);
        }
    }
    return 0; //结束
}

博客日记:昨天,老师考了一套普及组的题目,拿到题目后,我一眼就看到了这道题(因为它是第一题,真的很显眼),我一阵狂喜,但是,我就是没有考虑到末尾是X的情况,就丢了50分,
导致我就考砸了,肠子都悔青了,这也说明做得起的题就要保证拿满分,不然就要考砸!

你可能感兴趣的:(NOIP2008)