惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
小众软件
小众软件
D
Docker
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
V2EX
博客园 - 叶小钗
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
IT之家
IT之家
博客园 - 司徒正美
M
MIT News - Artificial intelligence
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
罗磊的独立博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog

Ariasakaの小窝

Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝 Ariasakaの小窝
Ariasakaの小窝
2022-11-28 · via Ariasakaの小窝

前往以下网站,不保证安全性哦喵~P1055 [NOIP2008 普及组] ISBN 号码洛谷

前言

这是本蒟蒻の第一篇题解qwq,发在博客上,还请多多关照.

这道题是一道橙题,难度没有太大的问题,对于大犇们来说自然是一遍过的,本蒟就只能调调再交了.

题面

查看题目

## 题目描述 每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 99 位数字、11 位识别码和 33 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 00 代表英语;第一个分隔符 - 之后的三位数字代表出版社,例如 670670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。 识别码的计算方法如下: 首位数字乘以 $1$ 加上次位数字乘以 $2$ ……以此类推,用所得的结果 $\bmod 11$,所得的余数即为识别码,如果余数为 $10$,则识别码为大写字母 $X$。例如 ISBN 号码 0-670-82162-4 中的识别码 $4$ 是这样得到的:对 067082162 这 99 个数字,从左至右,分别乘以 $1,2,\dots,91,2,…,9$ 再求和,即 $0\times 1+6\times 2+……+2\times 9=158$,然后取 $158 \bmod 11$ 的结果 $4$ 作为识别码。 你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。 ## 输入格式 一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。 ## 输出格式 一行,假如输入的 ISBN 号码的识别码正确,那么输出 Right,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 -)。 ## 输入输出样例 输入 #1 0-670-82162-4 输出 #1 Right 输入 #2 0-670-82162-0 输出 #2 0-670-82162-4 ## 说明/提示 2008 普及组第一题 (PS:08 年的第一题甚至比 22 年要难...)

解析

题目中说到保证输入符合 ISBN 号码的格式要求,这时很明显了,我们可以使用 scanf 直接输入数字,处理也会更加简单。需要注意的是最后一位识别码可能会出现 $X$ ,建议最后一位使用 "%c" 而不是 "%d"最后结果+ '0' 比较就行了。

对于位数的拆分,在这种位数不多的时候,我是采用手拆的,这样子就可以减少某些调试量偷懒

最后,每一位加起来 $\bmod 11$ ,+'0'进行比较即可(PS结果为 $10$ 时需要特判)。

代码

我已经详细看完并理解了上面的内容,并且不会直接照搬
CPP
#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,s;
    char d;
    scanf("%d-%d-%d-%c",&a,&b,&c,&d); //scanf读入
    s=(a+b/100*2+b%100/10*3+b%10*4+c/10000*5+c%10000/1000*6+c%1000/100*7+c%100/10*8+c%10*9)%11; //拆位相加
    if(s==10&&d=='X'){ //特判
        cout<<"Right";
        return 0;
    }
    else if(s+'0'==d){
        cout<<"Right";
        return 0;
    }
    else
        if(s==10){
            printf("%d-%d-%d-X",a,b,c); //特判
        }
        else{
            printf("%d-%d-%d-%d",a,b,c,s);
        }
    return 0;
}

洛谷P1055 [NOIP2008 普及组] ISBN 号码