首页 > 试题广场 >

[NOIP2008]ISBN号码

[编程题][NOIP2008]ISBN号码
  • 热度指数:24328 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 50M,其他语言100M
  • 算法知识视频讲解
每一本正式出版的图书都有一个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
是真的麻烦
#include<stdio.h>
int main(){
    char str[20];
    int ISBN,sum;
    for(int i=0;i<13;i++) scanf("%c",&str[i]);
    //printf("%c\n",str[2]);
    sum=str[0]-'0'+(str[2]-'0')*2+(str[3]-48)*3+(str[4]-48)*4+(str[6]-48)*5+(str[7]-'0')*6+(str[8]-48)*7+(str[9]-'0')*8+(str[10]-'0')*9;
    ISBN=sum%11;
    //printf("%d %d %c\n",sum,ISBN,str[12]);
    //'X'的ASCII编码值十进制为88
    if(str[12]=='X'){
        if( (str[12]-78) == ISBN) printf("Right");
        else{
        if(ISBN!=10){
             for(int i=0;i<12;i++) printf("%c",str[i]);
             printf("%d",ISBN);
        }
       else{
           for(int i=0;i<12;i++) printf("%c",str[i]);
           printf("X");
       }
    }
    }
    else{
        if(ISBN==(str[12]-'0')) printf("Right");
        else{
        if(ISBN!=10){
             for(int i=0;i<12;i++) printf("%c",str[i]);
             printf("%d",ISBN);
        }
       else{
           for(int i=0;i<12;i++) printf("%c",str[i]);
           printf("X");
       }
    }
    }
    return 0;
}


发表于 2022-06-14 14:20:25 回复(0)
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main{
       public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String x=in.next();
        String str="\\d\\-\\d{3}\\-\\d{5}\\-\\w";
        String h = "";
        if( Pattern.matches(str,x))
        {
            String a="\\-";
           h+=x.replaceAll(a,"");
        }
        char []arr=h.toCharArray();
        int sum=0;
        for(int i=1;i<=arr.length-1;i++){
            sum+=(arr[i-1]-'0')*i;
        }
     
        //System.out.println(sum);
       // System.out.println((arr[0]-'0'));
      if((sum%11==(arr[arr.length-1]-'0'))||(sum%11==10)&&(arr[arr.length-1]=='X'))
      {  System.out.print("Right");
        }
        else{
            int temp=sum%11;
               String f=x.substring(0,x.length()-1);
            if(temp!=10)
                { f+=temp;}
            else{
                f+='X';
            }
            System.out.print(f);
        }
    }
}
发表于 2022-05-06 20:54:28 回复(0)
#include<stdio.h>
int main()
{
    char arr[15];
    gets(arr);
    int len = strlen(arr);
    int i = 0;
    int sum = 0;
    int j = 1;
    for(i=0;i<len-2;i++)
    {
        if(arr[i]!='-')
        {
            sum = sum + (((int)arr[i]-'0')*j);//在char类型里面数字是存的assci码值!所以需要-‘0’
            j++;
        }
    }
    //printf("%d\n",sum);
    if(sum%11!=10)//识别码不是x的情况
    {
        if((sum%11)==((int)arr[len-1]-'0'))
        {
            printf("Right");
        }
        else if(sum%11!=(int)arr[len-1]-'0')
        {
            arr[len-1] = (sum%11)+'0';
            printf("%s",arr);
        }
    }
    else if(sum%11==10)//识别码是x的情况 
    {
        //正确的情况
        if(arr[len-1]=='X')
        {
            printf("Right");
        }
        //错误的情况
        else
        {
            arr[len-1] = 'X';
            printf("%s",arr);
        }

    }
    return 0;
}

发表于 2022-03-15 14:47:46 回复(0)
一个for一个if搞定
#include <stdio.h>
int main() {
    char arr[14];
    int i, arr2[14] = { 1, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9 };
    int sum = 0;
    scanf("%s", arr);
    for (i = 0; i < 11; i++) {
        sum += (arr[i] - '0') * arr2[i];
    }
    if ((arr[12] == 'X' ? 10 : arr[12] - '0') != sum % 11) {
        arr[12] = sum % 11 == 10 ? 'X' : sum % 11 + '0';
        printf("%s", arr);
    } else
        printf("Right");
    return 0;
}


发表于 2024-02-20 17:49:37 回复(1)
#include <stdio.h>

int main(){
    char code[13] = { 0 };// (1)-(3)-(5)-(1)
    for(int i = 0; i < 13; i++){
        scanf("%c", &code[i]);
    }
    int num = (code[0]-'0') + (code[2]-'0')*2 + (code[3]-'0')*3 + (code[4]-'0')*4+ (code[6]-'0')*5
            + (code[7]-'0')*6 + (code[8]-'0')*7 + (code[9]-'0')*8 + (code[10]-'0')*9;
    
    int code_id = code[12] == 'X' ? 10 : code[12] - '0'; 
    int code_rid = num % 11;
    if(code_id != code_rid){ 
        code[12] = code_rid == 10 ? 'X' : code_rid + '0';
        printf("%s", code);
    }   
    else
        printf("Right");
    return 0;
}

发表于 2022-05-23 16:16:39 回复(0)

#include <stdio.h>

int main() {
    char ret[13] = {0};
    int i = 0;
    for(i = 0;i < 13; i++)
    scanf("%c",&ret[i]);

    int sum=0;
    int count = 1;
    for(i = 1;i < 13 ; i++)
    {
        if(ret[i-1] >= '0' && ret[i-1] <= '9')
        {
            sum+=(ret[i-1]-48) * count;
            count++;
        }
    }
   

    if(sum % 11 == (ret[12] - 48) || sum % 11 == 10 && ret[12] == 'X')
       printf("Right\n");
    else
    {
        if(sum % 11 < 10)
        ret[12] = sum % 11 + 48;
        else if(sum % 11 == 10)
        ret[12] = 'X';
        for(i=0;i<13;i++)
        {
            printf("%c",ret[i]);
        }
        printf("\n");
    }

    return 0;
}
发表于 2023-06-28 00:11:12 回复(0)
prev = input()
l = prev.replace('-','')

total = 0
for i in range(len(l)-1):
    total += int(l[i])*(i+1)
code  = str(total%11)
if code == '10':
    code = 'X'
# 检查
print('Right' if code == prev[-1] else prev[:-1]+code)

发表于 2022-03-26 22:24:11 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    cin >> s;
    int code = 0, k = 1;
    for (int i = 0; i < s.size() - 1; i ++ )
    {
        if (s[i] != '-')
        {
            code += (s[i] - '0') * k;
            k ++;
        }
    }
    code %= 11;
    char end = '0';
    if (code == 10) end = 'X';
    else end += code;
    if (end == s[s.size() - 1]) cout << "Right" << endl;
    else {
        s[s.size() - 1] = end;
        cout << s << endl;
    }
    
    
}

发表于 2022-02-26 14:14:10 回复(0)
字符串的思路
#include <stdio.h>

int main() 
{
    char str[20] = {0};
    scanf("%s", str);
    int total = *(str) + *(str + 2) * 2 + *(str + 3) * 3 + *(str + 4) * 4 + 
                *(str + 6) * 5 + *(str + 7) * 6 + *(str + 8) * 7 + *(str + 9) * 8 + 
                *(str + 10) * 9 - 48 * (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);//可以简化
    int key = total % 11; //key的值为0~10

    //字符0的acsll值为48,key+48转为数组字符
    //*(str+12)代表最后一位的识别码
    //当key为10时,*(str+12)应该为‘X’,‘X’的ascll值为88
    //应该要判断key+78 == *(str+12) 的值
    if (key + 48 == *(str + 12) || (key + 78 == *(str + 12)))
        {
            printf("Right\n");
        }
    else 
    {
        if (key == 10) {       //余数为10,识别码为‘X’
            *(str + 12) = 'X';
            printf("%s\n", str);

        } else {
            *(str + 12) = key + 48; //key+48转化为字符0~9
            printf("%s\n", str);
        }
    }

    // int total = 0;
    // int i =0;
    // for(i = 1; i<=9; i++)
    // {
    //     total+=(*str) * i;
    //     str++;
    // }
    return 0;
}


发表于 2024-04-19 21:38:42 回复(0)
可以写得更简洁,但不想在这种题上改了。X搞得有点烦了
#include <stdio.h>

//计算权重
//x为需要计算的数,n表示当前阶段的权重
int Calc(int x, int n)
{
    if (x <= 0)
    {
        return 0;
    }

    return Calc(x / 10, n - 1) + x % 10 * n;
}

int main()
{
    int i = 0;
    int s = 0;
    int b = 0;
    char n = 0;
    int rightN = 0;

    scanf("%d-%d-%d-%c", &i, &s, &b, &n);

    rightN = (Calc(i, 1) + Calc(s, 4) + Calc(b, 9)) % 11;

    if(n == 'X' || n == 'x')
    {
        n = '0' + 10;
    }

    if (rightN == n - '0')
    {
        printf("Right\n");
    }
    else if(rightN == 10)
    {
        printf("%d-%d-%d-X\n", i, s, b);
    }
    else
    {
        printf("%d-%d-%d-%d", i, s, b, rightN);
    }

    return 0;
}


编辑于 2024-03-29 18:46:15 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int function(int a,int i)
{
    return a * i;
}

int c = 0;
int main()
{
    char arr[11] = { 0 };
    for (int i = 1; i <= 10; i++)
    {
        scanf("%c", &arr[i]);
        if (arr[i] == '-')
            {
                i--;
            }
    }
    for (int i = 1; i < 10; i++)
    {
        c += function(arr[i]-48, i);
        
    }
    if (c % 11 == 10 && arr[10] == 'X')
    {
        printf("Right");
    }
    else if (c % 11 == arr[10]-48)
    {
        printf("Right");
    }
    else
    {
        for (int i = 1; i < 10; i++)
        {
            printf("%c", arr[i]);
            if (i == 1||i==4||i==9)
            {
                printf("-");
            }
        }
        if (c % 11 != 10)
        {
            printf("%d", c % 11);
        }
        else
        {
            printf("X");
        }
    }
    return 0;
}
发表于 2023-12-28 13:03:30 回复(1)
#include <stdio.h>
//循环看不太懂,还不太熟悉
int main() {
    char a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
    int ret, tmp;
    char e, f, g;
    scanf("%c%c%c%c%c%c%c%c%c%c%c%c%c", &a1, &e, &a2, &a3, &a4, &f, &a5, &a6, &a7,
          &a8, &a9, &g, &a10);
    ret = (a1 - '0') * 1 + (a2 - '0') * 2 + (a3 - '0') * 3 + (a4 - '0') * 4 +
          (a5 - '0') * 5 + (a6 - '0') * 6 + (a7 - '0') * 7 + (a8 - '0') * 8 +
          (a9 - '0') * 9;
    tmp = ret % 11;
    //将数字字符转为数字有两种方法:
    //第一种:用数字字符减去’0’即’1’ - ‘0’(它俩是用ASCII码相减的即49 - 48 = 1)
    //第二种:用数字字符减去48(48是‘0’的ASCII码)即’1’ - 48 = 1
    if (tmp == (a10 - '0') || tmp == (a10 - 78)) //'X'=88,
        printf("Right");
    else if (a10 != 'X' && tmp == 10) {
        printf("%c-%c%c%c-%c%c%c%c%c-X", a1, a2, a3, a4, a5, a6, a7, a8, a9);
    } else
        printf("%c-%c%c%c-%c%c%c%c%c-%d", a1, a2, a3, a4, a5, a6, a7, a8, a9, tmp);
    return 0;
}

发表于 2023-04-17 21:00:09 回复(0)
#include <stdio.h>

int main() {
    char i[13] = {0};
    int j = 0;
    int k = 1;
    int sum = 0;
    scanf("%s", i);
    for(j = 0; j < 11; j++)
    {
        if(i[j] == '-')
        {
            continue;
        }
        else
        {
            sum = sum + k * (i[j] - '0');
            k++;
        }
    }
    int x = sum % 11;
    if(x == (i[12] - '0') || (x == 10 && i[12] == 'X'))
    {
        printf("Right");
    }
    else {
        for(j = 0; j < 12; j++)
        {
            printf("%c", i[j]);
        }
        if(x == 10)
        {
            printf("X");
        }
        else {
            printf("%d", x);
        }
    }

    return 0;
}
发表于 2023-02-27 18:51:43 回复(2)
发表于 2022-12-04 15:34:43 回复(0)
a=input()
s=a.split('-')
new_lis=[]
sum=0
the_last=''
for i in s:
    for j in i:
        new_lis.append(j)
for i in range(0,9):
    sum+=(i+1)*int(new_lis[i])
if sum%11==10:
    the_last='X'
else:
    the_last=str(sum%11)
if the_last==new_lis[-1]:
    print('Right')
else:
    print(a[:-1]+the_last)


发表于 2022-11-23 11:00:00 回复(0)
#include <stdio.h>
int main() {
    int ch = 0, i = 0,j=0,sum=0;
    char arr[13];
    while ((ch = getchar()) !='\n') {//多组输入
        arr[i] = ch;
        if (arr[i] != '-'&&i!=12) {
            sum+=((int)arr[i] - '0')* (j + 1);//数字字符转整形数字
            j++;
        }
        i++;
    }
    if(arr[12]=='X'&&sum%11==10)//为x的情况
        printf("Right\n");
    else if (sum % 11 == ((int)arr[12]-'0'))
        printf("Right\n");
    else{
        for (int k = 0; k < 12; k++) {
            printf("%c", arr[k]);
        }
        if(sum%11==10)
        printf("X");
        else
        printf("%d",sum%11);
        printf("\n");
}
}

发表于 2022-10-26 20:11:14 回复(0)
#include <stdio.h>

int main() {
    char array[100];
    scanf("%s", array);
    int cont = 0, j = 1, sum = 0;
    for (int i = 0; i < 13; i++) {
        if (array[i] >= '0' && array[i] <= '9') {
            sum += (array[i]-48) * j;
            j++;
            cont++;
        }
        if(cont==9)break;
    }
    char b;
    int a = sum % 11;
    if(a==10){
        b = 'X';
    }else{
        b = a+48;
    }
    if(array[12]==b){
        printf("Right\n");
    }else{
        array[12]=b;
        printf("%s",array);
    }
    return 0;
}

发表于 2022-09-18 19:45:03 回复(0)
#include <stdio.h>

int main() {
    char arr[20];
    scanf("%s",arr);
    int ret=0;
    int count=1;
    for (int i=0; i<12; i++) 
    {
        if (arr[i]=='-') 
        {
            continue;
        }
        else 
        {
            ret=ret+(arr[i]-48)*count;
            count++;
        }
    }
    ret%=11;
    if (ret==(int)arr[12]-48) 
    {
        printf("Right");
        return 0;
    }
    else 
    {
        if (arr[12]=='X' && ret==10) 
        {
            printf("Right");
            return 0;
        }
        else 
        {
            if (ret==10) 
            {
                for (int i=0; i<12; i++) 
                {
                    printf("%c",arr[i]);
                }
                printf("X");
            }
            else 
            {
                for (int i=0; i<12; i++) 
                {
                    printf("%c",arr[i]);
                }
                printf("%d",ret);
            }
        }
    
    }
    return 0;
}
比较菜,写的代码有点长

发表于 2024-04-28 08:56:15 回复(0)
#include <iostream>
using namespace std;

int main(){
   int num[9] ;
   char a;
   scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%c",&num[0],&num[1],&num[2],&num[3],&num[4],&num[5],&num[6],&num[7],&num[8],&a);
   int biaoshi=0;
   for(int i=0;i<9;i++){
        biaoshi += num[i]*(i+1);
   }
    biaoshi = biaoshi % 11;

    if(biaoshi < 10){
        if(biaoshi == (static_cast<int>(a)-48)){
            cout << "Right\n";
        }else{
            printf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%d",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],biaoshi);
        }
    }else{
        if(a=='X'){
            cout << "Right\n";
        }else{
            printf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-X",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8]);
        }
    }
    return 0;
}
发表于 2024-03-17 14:52:51 回复(0)
#include <stdio.h>

int main()
{
    char a[14];
    int i, j = 0, b = 0;
    scanf("%s", a);
    for (i = 0; i <= 13; i++)
    {
        if (i == 1 || i == 5 || i >= 11 && i <= 13)
        { }
        else
        {
            b = b + (j + 1) * (a[i] - '0');
            j++;
        }
    }
    b = b % 11;
    if(b == 10)
        b = 'X';
    else
        b = b + '0';
    if (b == a[12])
        printf("Right");
    else
    {
        a[12] = b;
        printf("%s", a);
    }
    return 0;
}

发表于 2024-03-03 17:50:52 回复(0)

问题信息

难度:
79条回答 1493浏览

热门推荐

通过挑战的用户

查看代码