列表

详情


BC76. [NOIP2008]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

输出:

Right

示例2

输入:

0-670-82162-0

输出:

0-670-82162-4

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 284KB, 提交时间: 2022-05-29

#include <stdio.h>
int main()
{
    char a[13];
    int b,c=0,d=1,m;
    scanf("%s",a);
    for(b=0;b<=10;b++)
    {
        if (a[b]!='-'){
            c+=((a[b]-'0')*d);
            d++;
        }
    }
    m=c%11;
    if (m==10 && a[12]=='X')
        printf("Right");
  else  if (m==a[12]-'0')
    {
        printf("Right");
    }
    else
    {
        a[12]=m+'0';
        if (a[12]==':')
            a[12]='X';
        printf("%s",a);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 292KB, 提交时间: 2022-03-14

#include <stdio.h>
int main() {
    char arr[14] = { 0 };
    scanf("%s", &arr);
    int sum = 0;
    int i = 0;
    int j = 1;
    for (i = 0; i < 11; i++) {
        if (arr[i] == '-')
            continue;
        else {
            sum += (arr[i] - '0') * j;
            j++;
        }
    }
    sum %= 11;
    if (sum == 10)
        sum = 'X' - '0';
    if (arr[12] == sum + '0')
        printf("Right\n");
    else {
        arr[12] = sum + '0';
        printf("%s", arr);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2022-06-14

#include<stdio.h>
int main()
{
    char str[13]={0};
    scanf("%s",str);
    int sum=0;
     int j=1;
    for(int i=0;i<11;++i)
    {
        if(str[i]!='-')
        {
            sum+=(str[i]-'0')*j;
            ++j;
        }
    }
    int mod=sum%11;//最后一位的识别码
    if(mod== str[12]-'0'||(mod==10&&str[12]=='X'))
    {
        printf("Right\n");
    }
    else
    {
        if(mod==10)
        {
            for(int i=0;i<12;++i)
            {
                printf("%c",str[i]);
            }
             printf("X");
        }
        else
        {
            for(int i=0;i<12;++i)
            {
                printf("%c",str[i]);
            }
             printf("%d",mod);
        }
       
    }    
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2022-03-15

#include <stdio.h>
int main()
{
	char arr[13];
	int n = 1, sum = 0, ret;
	scanf("%s", &arr);
	for (int i = 0; i < 12; i++)
	{
		if (arr[i] != '-')
		{
			sum += (arr[i] - '0') * n;
			n++;
		}
	}
	ret = sum % 11;
	if ((ret + '0') == arr[12]|| ret +78 == arr[12])
		printf("Right");
	else
	{
	switch (ret)
	{
	case 0: arr[12] = '0'; break;
	case 10: arr[12] = 'X'; break;
	default: arr[12] = ret + '0'; break;
	}
	printf("%s", arr);
	}
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 300KB, 提交时间: 2022-07-26

#include<stdio.h>
int main(){
    int a,b,c,d,e,f,g,h,i,J_r,bcd,efghi;
    char J;
    scanf("%d-%d-%d-%c",&a,&bcd,&efghi,&J);
    d = bcd%10;
    c = (bcd%100-d)/10;
    b = (bcd%1000-c*10-d)/100;
    i = efghi%10;
    h = (efghi%100-i)/10;
    g = (efghi%1000-h*10-i)/100;
    f = (efghi%10000-g*100-h*10-i)/1000;
    e = (efghi%100000-f*1000-g*100-h*10-i)/10000;
    J_r = (a+b*2+c*3+d*4+e*5+f*6+g*7+h*8+i*9)%11;
    if (J_r == 10) {
        if (J == 'X') printf("Right\n");
        else printf("%d-%d%d%d-%d%d%d%d%d-X\n",a,b,c,d,e,f,g,h,i);
    }
    else {
        if ((int) (J-'0') == J_r) printf("Right\n");
        else printf("%d-%d%d%d-%d%d%d%d%d-%d\n",a,b,c,d,e,f,g,h,i,J_r);
    }
//     printf("%d\n",J);
//     printf("%d\n",(int)'X');
}

上一题