C语言每日一题——[NOIP2008]ISBN号码(牛客网第76题)

简介: 笔记

描述


每一本正式出版的图书都有一个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-0


图解


1.png2.png




详解



2.png4.png



代码


#include<stdio.h>
int  main()
{
    char a = 'w';
    int i = 0;
    int j = 0;
    int t = 1;
    int sum = 0;
    int mod;
    int k[10] = { 0 };
    for (i = 0; i < 13; i++)
    {
        scanf("%c", &a);
        if ((a - '0') >= 0 && (a - '0' <= 9) || a == 'X')
            k[j++] = a - '0';
    }
    for (i = 0; i < 9; i++)
    {
        sum = k[i] * (t++) + sum;
    }
    mod = sum % 11;
    if (mod == 10 && a == 'X')      // 余数为10,结尾位X
        printf("Right");
    if (mod == 10 && a != 'X')   //余数为10,结尾不为X
    {
        for (i = 0; i < 9; i++)
        {
            if (i == 0)
                printf("%d-", k[i]);
            else if (i == 4 || i == 9)
                printf("-%d", k[i]);
            else
                printf("%d", k[i]);
        }
        printf("-X");
    }
    if (k[9] == mod && mod != 10)         //结尾等于余数
        printf("Right");
    if (k[9] != mod && mod != 10)//结尾不等于余数
    {
        for (i = 0; i < 9; i++)
        {
            if (i == 0)
                printf("%d-", k[i]);
            else if (i == 4 || i == 9)
                printf("-%d", k[i]);
            else
                printf("%d", k[i]);
        }
        printf("-%d", mod);
    }
    return 0;
}


小优化


可将char a[13]={"w"};换为char a='w';因为我们在输入数值的时候是在for语句下输入的,并且每次输入完之后会对这个值进行判断,并决定是否存储到int型数组中,所以for每循环一次,我们可将char a[13]中遍历到的数字换成下一个,没必要开辟13个空间,一个就够了。


如果最后一位等于'X',不必将它的ASCII码值存到int k数组的第十位因为我们始终都没有用到它的ascii码值


优化后代码


#include<stdio.h>
int  main()
{
    char a = 'w';
    int i = 0;
    int j = 0;
    int t = 1;
    int sum = 0;
    int mod;
    int k[10] = { 0 };
    for (i = 0; i < 13; i++)
    {
        scanf("%c", &a);
        if ((a - '0') >= 0 && (a - '0' <= 9) )
            k[j++] = a - '0';
相关文章
|
6月前
|
算法 C++
【洛谷 P1055】[NOIP2008 普及组] ISBN 号码 题解(字符串)
该编程题目要求编写程序检查输入的ISBN号码的识别码是否正确。ISBN号码格式为`x-xxx-xxxxx-x`,其中`x`是数字,最后一位是通过特定算法计算得出的识别码。算法是将前9位数字乘以1到9的加权值,求和后对11取模,模为10时识别码为大写`X`,否则为对应模值的数字。程序接收一个符合格式的ISBN号码,验证识别码并输出`Right`(如果正确)或修正后的正确ISBN号码。提供的AC代码使用C++实现这一功能。
83 0
|
6月前
【洛谷 P1093】[NOIP2007 普及组] 奖学金 题解(结构体排序)
**NOIP2007普及组奖学金问题**:根据学生语文、数学、英语三科成绩计算总分并排序。若总分相同,按语文成绩高者优先,再相同则学号小者靠前。程序需输出前5名学生的学号和总分。输入包括学生人数`n`和每人的三科成绩,输出为5行结果。示例输入和输出已给出,代码通过定义结构体和自定义比较器实现排序。
52 0
|
7月前
|
C语言
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
|
Java C语言
C语言 每日一题 牛客网 11.12 Day16
C语言 每日一题 牛客网 11.12 Day16
75 0
|
C语言
C语言 每日一题 牛客网 11.13 Day17
C语言 每日一题 牛客网 11.13 Day17
50 0
|
算法 C语言
C语言 每日一题 牛客网习题 10.20 day2
C语言 每日一题 牛客网习题 10.20 day2
53 0
洛谷P1055 ISBN号码(C++解法)
洛谷P1055 ISBN号码(C++解法)
179 0
洛谷刷题题解笔记----P1055 [NOIP2008 普及组] ISBN 号码(通过第4第8测试点)
洛谷刷题题解笔记----P1055 [NOIP2008 普及组] ISBN 号码(通过第4第8测试点)
|
C语言
【C语言每日一题】猜名次
【C语言每日一题】猜名次
109 0
|
Java 测试技术 C语言
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期
【蓝桥杯基础题】2020年省赛填空题—回文日期