首页 > 试题广场 >

ISBN号码

[编程题]ISBN号码
  • 热度指数:34758 时间限制: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 arr[14];
    scanf("%s",arr);
    char arr1[10];
    int i=0;
    for(int j=0;j<10;j++)
    {
     if(arr[i]!='-')
     {
        arr1[j]=arr[i];
        i++;
     }
     else {
     arr1[j]=arr[i+1];
     i+=2;
     }
    }
    int sum=0;
    int u=0;
    for(int v=1;v<=9;v++)
    {
        sum=sum+(arr1[u]-'0')*v;
        u++;
    }
    int term=sum%11;
    if(term==10)
    {
        if(arr[12]=='X')
        {
            printf("Right");
        }
        else {
        arr[12]='X';
        printf("%s",arr);
        }
    }
    else {
    if(arr[12]-'0'==term)
    {
        printf("Right");
    }
    else {
    arr[12]=term+'0';
    printf("%s",arr);
    }
    }
    return 0;
}
发表于 2025-12-03 08:49:11 回复(0)
//依旧展示
#include <stdio.h>
#include <stdlib.h>

int main() {
    char* s;
    int result;
    int sum=0,count=1;
    char indentity;
    s=(char*)malloc(20*sizeof(char));
    scanf("%s",s);
    for(int i=0;i<13;i++){
        // if(i==1||i==5||i==11) continue;
        if(s[i]=='-') continue;//排除分隔符和
        if(count>9) break;//// 只计算前9位有效数字(最后一位识别码)
        // if(count==10) break;
        sum+=count*(s[i]-'0');
        count++;
    }
    result=sum%11;
    if(result==10) indentity='X';
    else indentity=result+'0';
    if(indentity==s[12]) printf("Right\n");
    else {
        s[12]=indentity;
        printf("%s\n",s);
    }
    free(s);//释放动态分配的内存,防止内存泄露
    return 0;
}
发表于 2025-10-10 21:20:04 回复(0)
#include <stdio.h>

int main() {
    char a[14];
    scanf("%13s",a);
    int s=0,w=1,i;
    for(i=0;i<12;i++){
        if(a[i]=='-')
            continue;
        s+=(a[i]-'0')*w;
        w=(w%9)+1;
    }
    char b;
    int c=s%11;
    if(c==10)
        b='X';
    else
        b=c+'0';
    if(b==a[12])
        printf("Right");
    else{
        a[12]=b;
        printf("%s",a);
    }
    return 0;
}
发表于 2025-08-11 18:08:20 回复(0)
#include <stdio.h>

int main() {
    int a,b,c;
    char d;
    scanf("%1d-%3d-%5d-%c",&a,&b,&c,&d);
    int sum=a*1+b/100*2+b/10%10*3+b%10*4+c/10000*5+c/1000%10*6+c/100%10*7+c/10%10*8+c%10*9;
    int number=sum%11;
    char e=  number + '0';
    if(number==10){
        e='X';
       
    }
    if(d==e){
        printf("Right\n");
    }
    else{
        printf("%d-%d-%d-%c",a,b,c,e);
    }
   
}
发表于 2025-03-06 09:21:54 回复(0)
#include <stdio.h>
//用ASC码转换做的,自己都快做晕了
int main() {
    char arr1[13] = {0};
    int arr2[10] = {0};
    int i = 0, j = 0, total = 0, check = 0;
    for (i = 0; i < 13; i++) {
        scanf("%c", &arr1[i]);
        if (i != 1 && i != 5 && i != 11 && i != 12) {
            arr2[j] = arr1[i] - 48;
            total += (j + 1) * arr2[j];
            j++;
        } else if (12 == i) {
            if ((int)arr1[12] == 88) {
                arr2[9] = 88;
            } else {
                arr2[9] = arr1[i] - 48;
            }
        }
    }
    check = total % 11;
    if (arr2[9] == check && check != 10) {
        printf("Right");
    } else if (10 == check && arr2[9] == 88) {
        printf("Right");
    } else {
        arr1[12] = total % 11 + 48;
        if (10 == check) {
            arr1[12] = 'X';
        }
        for (i = 0; i < 13; i++) {
            printf("%c", arr1[i]);
        }

    }
    return 0;
}
发表于 2025-01-07 12:35:29 回复(0)
int main()
{
    int lan = 0,pub=0,id=0;
    char PIN;
    scanf("%d-%d-%d-%c", &lan,&pub,&id,&PIN);
    int sum = 0,sum1=0,sum2=0;
    int pub1=pub,id1=id;//先将值保存在另一个变量中
    int i = 0;
    //求pub的相加之和
    for (i = 4; i >= 2; i--)
    {
        sum += (pub % 10)*i;
        pub = pub/10;
    }
    //求id相加之和
    for (i = 9; i >= 5; i--)
    {
        sum1 += (id % 10) * i;
        id = id/10;
    }
    sum2 = (lan * 1 + sum1 + sum)%11;
    //分两种情况,一种是sum2等于10的情况,一种是sum2不为10的情况
    //1、为10的情况
    while (sum2 == 10)
    {
        if (PIN=='X')
        {
            printf("Right");
            break;
        }
        else
        {
            PIN = 'X';
            printf("%d-%d-%d-%c", lan, pub1, id1, PIN);
            break;
        }
    }
    //2、不为10的情况
    while (sum2 != 10)
    {
        if (sum2==(int)PIN-'0')//用所输入对应的ASCII值减去'0',即为所表达的数字
        {
            printf("Right");
            break;
        }
        else
        {
            printf("%d-%d-%d-%d", lan, pub1, id1, sum2);
            break;
        }
    }
    return 0;
}
发表于 2024-08-10 18:45:58 回复(0)
#include<stdio.h>
int main()
{
int a,b,c,e;
int f;
char d;
scanf("%d-%d-%d-%c",&a,&b,&c,&d);
e=(a*1+b/100*2+(b/10%10)*3+(b%10)*4+(c/10000)*5+(c/1000%10)*6+(c/100%10)*7+(c/10%10)*8+(c%10)*9);
 f=e%11;
 int g; 
 if(f==g){
     printf("Right\n");
 }
if(d=='X')
{
    g=10; 
}

     if(f<10&&f!=g){
     
     printf("%d-%d-%d-%d",a,b,c,f);
 }
 if(f==10&&f!=g)
 {
     printf("%d-%d-%d-X",a,b,c);
 }
 
    return 0;
}
发表于 2024-08-05 12:04:16 回复(1)
#include<stdio.h>

int jisuan(int x,int y,int z)
{

int ma=(x+(y/100)*2+((y%100)/10*3)+(y%10)*4+(z/10000)*5+(z%10000)/1000*6+(z%1000)/100*7+(z%100)/10*8+z%10*9)%11;
return ma;
}

int main()
{
int a=0,b=0,c=0;
int d=0;
scanf("%d-%d-%d-%d",&a,&b,&c,&d);//若输入d为x的话 则其默认为0
int panduan=jisuan(a,b,c);
if(panduan==10)
      {
        if(d==0)
     printf("Right");
     else
      printf("%d-%d-%d-X",a,b,c);
      }
else
   {
    if(panduan==d)
     printf("Right");
    else
    printf("%d-%d-%d-%d",a,b,c,panduan);
   }
    return 0;
}
发表于 2024-08-03 10:25:33 回复(0)
求指教
#include <stdio.h>
int main() {
    char a[13];
    scanf("%s",&a);
    int n = 1;
    int sum = 0;
    for(int i = 0; i < 12; i++)
    {
        if(a[i]>='0'&&a[i]<='9')
        {
            sum += n * (a[i] - '0');
            n++;
        }
    }
    int ecc = sum % 11;
    if(ecc == 10&&a[12]=='X')
    {
        printf("Right");
    }
    else if (ecc == 10&&a[12]!='X')
    {
        a[12] = 'X';
        for(int i = 0; i < 13; i++)
        {
            printf("%c",a[i]);
        }
    }
   
   
    else if (ecc == (a[12]-'0'))
    {
        printf("Right");
    }
    else {
        a[12] = ecc + '0';
        for(int i = 0; i < 13; i++)
        {
            printf("%c",a[i]);
        }
    }
    return 0;
}
发表于 2024-08-01 00:08:38 回复(0)
#include <stdio.h>
#include <string.h>

// 计算识别码
char calculate_check_digit(const char* isbn) {
    int sum = 0;
    for (int i = 0, j = 1; i < 9; i++, j++) {
        sum += (isbn[i] - '0') * j;
    }
    int check_digit = sum % 11;
    if (check_digit == 10) {
        return 'X';
    } else {
        return '0' + check_digit;
    }
}

int main() {
    char isbn[18]; // 输入的ISBN号码,包括分隔符
    scanf("%s", isbn);

    // 提取前9位数字和输入的识别码
    char digits[10];
    int index = 0;
    for (int i = 0; isbn[i] != '\0'; i++) {
        if (isbn[i] >= '0' && isbn[i] <= '9') {
            digits[index++] = isbn[i];
        }
    }
    digits[9] = '\0';

    // 计算正确的识别码
    char correct_check_digit = calculate_check_digit(digits);

    // 比较识别码
    if (isbn[12] == correct_check_digit) {
        printf("Right\n");
    } else {
        // 输出正确的ISBN号码
        printf("%c-%c%c%c-%c%c%c%c%c-%c\n",
               digits[0], digits[1], digits[2], digits[3],
               digits[4], digits[5], digits[6], digits[7], digits[8],
               correct_check_digit);
    }

    return 0;
}
发表于 2024-06-30 21:15:11 回复(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)
#include <stdio.h>

int main() {
  int language, pub, num,id, result=0, n=1, pub1, num1;
  char ch;
  scanf("%d-%d-%d-%c", &language, &pub, &num, &ch);
  if(ch=='X'){
    id =10;
  }else {
    id = (int)ch -48;
  }
  pub1= pub;
  num1 = num;
  int a[9];
  // 数据拆分
  a[0] = language;
  for (int i = 3 ; i >= 1; i--) {
    a[i] = pub1 % 10;
    pub1 /= 10;
  }
  for (int i = 8 ; i >= 4; i--) {
    a[i] = num1 % 10;
    num1 /= 10;
  }
  for (int i = 0 ; i < 9; i++) {
    result += a[i] * n;
    n++;
  }
  result = result%11;
  if(result==id){
    printf("Right");
  }else if(result==10){
     printf("%d-%d-%d-X", language, pub, num);
  }else {
      printf("%d-%d-%d-%d", language, pub, num, result);
  }

  return 0;
}
编辑于 2024-02-24 14:32:10 回复(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 回复(4)
主要是把题目中这几个需要判断的地方梳理清楚
#include <stdio.h>
#include <stdint.h>
int main() {
    char AingleLetter[13] = {0}; //定义一个数组用来存放获取的数字
    int8_t i = 0;
    int8_t n = 1;
    int sum = 0;//用来存放求和
    int8_t md = 0;//用来存放求得的余数
    int LastCharacter;
    /*该循环把前12个字符和数字存入数组中*/
    for (i = 0; i <= 11; i++) {
        AingleLetter[i] = getchar();
        /*该判断把其中的数字按规则进行了求和*/
        if (AingleLetter[i] >= '0' && AingleLetter[i] <= '9') {
            sum = sum + n * (AingleLetter[i] - '0');//因为前面定义的字符类型,所以在转的过程中要减去'0'
            n++;
        }
    }
    md = sum % 11;
    AingleLetter[12] = getchar();//存入最后一个数字到数组
    /*该判断用来判断是否最后一个值是X*/
    if (AingleLetter[12] == 'X') {
       
        if (md == 10) {
            printf("Right");
        } else {
            AingleLetter[12] = '0' + md;
            /*判断完成,用循环输出*/
            for (int m = 0; m <= 12; m++ ) {
                printf("%c", AingleLetter[m]);
            }
        }
    } else {
        if (AingleLetter[12] == '0' + md) {
            printf("Right");
        } else {
            AingleLetter[12] = '0' + md;
            /*这里要对得到的余数进行判断,如果是10就要把最后一个转换为X,再输出*/
            if (md != 10) {
                /*判断完成,用循环输出*/
                for (int m = 0; m <= 12; m++ ) {
                    printf("%c", AingleLetter[m]);
                }
            } else {
                AingleLetter[12]='X';
                /*判断完成,用循环输出*/
                for (int m = 0; m <= 12; m++ ) {
                    printf("%c", AingleLetter[m]);
                }
            }
        }
    }
    return 0;
}

发表于 2024-02-02 10:21:54 回复(0)
#include <stdio.h>

int main() {
    char a[15] = {0};
    int sum;
    scanf("%s", a);
    sum = (a[0] - 48) * 1 + (a[2] - 48) * 2 + (a[3] - 48) * 3 + (a[4] - 48) * 4 +
          (a[6] - 48) * 5 + (a[7] - 48) * 6 + (a[8] - 48) * 7 + (a[9] - 48) * 8 +
          (a[10] - 48) * 9;
    sum = sum % 11;
    if (a[12] == 'X' && sum == 10) {
        printf("Right");
    } else if (sum == (a[12] - 48)) {
        printf("Right");
    } else {
        for (int i = 0; i <= 11; i++) {
            printf("%c", a[i]);
        }
        if (sum == 10) {
            printf("X");
        } else {
            printf("%d", sum);
        }
    }
    return 0;
}
发表于 2024-01-19 14:53:37 回复(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() {
    int arr[9]={0};
    char ISBN;
    scanf("%d-%1d%1d%1d-%1d%1d%1d%1d%1d-%c", arr,&arr[1],&arr[2],&arr[3],&arr[4],&arr[5],&arr[6],&arr[7],&arr[8],&ISBN); 
    int sum=0;
    int i=0;
    for(i=0;i<=8;i++)
    {
        sum=sum+(arr[i]*(i+1));
    }
    if((sum%11)==10)
    { 
       if(ISBN=='X')
       {
           printf("Right");
       }
      
       else
        {
            printf("%d-%d%d%d-%d%d%d%d%d-%c",arr[0], arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],'X');
        }
    }
    else
    {
         if((ISBN-48)==sum%11)
         {
            printf("Right");
         }
         else 
         {
            printf("%d-%d%d%d-%d%d%d%d%d-%d",arr[0], arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],sum%11);
         }
         
    }
    
    
    
    return 0;
}

发表于 2023-09-12 23:48:22 回复(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)