201312-2 ISBN号码

该博客主要展示了一段C++代码,用于处理日期格式的输入并进行特定的数学运算。通过读取年、月、日和一个字符,代码计算出一个模运算结果。如果结果与字符对应的数字相等或为10,并且字符为'X',则输出Right;否则,输出结果或'X'。博客中还包含了一些程序员的趣味元素。

题目:

思路分析:

格式化输入实现就行

然后可char存储直接-'0'转化为数字 

代码实现:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
 *                                                     __----~~~~~~~~~~~------___
 *                                    .  .   ~~//====......          __--~ ~~
 *                    -.            \_|//     |||\\  ~~~~~~::::... /~
 *                 ___-==_       _-~o~  \/    |||  \\            _/~~-
 *         __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *     _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *   .~       .~       |   \\ -_    /  /-   /   ||      \   /
 *  /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 *  |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *           '         ~-|      /|    |-~\~~       __--~~
 *                       |-~~-_/ |    |   ~\_   _-~            /\
 *                            /  \     \__   \/~                \__
 *                        _--~ _/ | .-~~____--~-/                  ~~==.
 *                       ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                  -_     ~\      ~~---l__i__i__i--~~_/
 *                                  _-~-__   ~)  \--______________--~~
 *                                //.-~~~-~_--~- |-------~~~~~~~~
 *                                       //.-~~~--\
 *                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *                               神兽保佑            永无BUG
 */



const int MAX=100010;
const int mod=11;
int main(){
    int a,b,c;
    char d;
    scanf("%d-%d-%d-%c",&a,&b,&c,&d);
    int ans=0;
    int b1,b2,b3;
    b1=b/100;
    b3=b%10;
    b2=(b-b1*100)/10;
    int c1,c2,c3,c4,c5;
    c1=c/10000;
    c5=c%10;
    c2=(c-c1*10000)/1000;
    c3=(c-c1*10000-c2*1000)/100;
    c4=(c-c1*10000-c2*1000-c3*100)/10;
    ans=(a+b1*2+b2*3+b3*4+c1*5+c2*6+c3*7+c4*8+c5*9)%mod;
    if(ans==10){
        if(d=='X'){
            cout<<"Right";
        }
        else cout<<a<<"-"<<b<<"-"<<c<<"-"<<"X";
    }
    else if(ans==(d-'0')){
        cout<<"Right";
    }
    else cout<<a<<"-"<<b<<"-"<<c<<"-"<<ans;
}

### ISBN号码生成与校验的实现方法 ISBN号码的生成与校验是基于特定算法完成的,其目的是确保每个出版物都有一个唯一的标识符。以下是关于ISBN号码生成与校验的技术信息和实现方法。 #### 1. ISBN号码的结构 ISBN号码由10位数字组成(2007年以前的标准),包括9位数字和1位校验码,中间用“-”分隔。例如,“x-xxx-xxxxx-x”,其中: - 第一位表示书籍的出版语言。 - 第二部分(三位)表示出版社。 - 第三部分(五位)表示该书在出版社的编号。 - 最后一位是识别码,用于验证ISBN号码的正确性。 #### 2. 校验码的计算方法 校验码的计算规则如下: 1. 将前9位数字从左至右分别乘以1到9。 2. 计算加权和 \( S \): \[ S = d_1 \times 1 + d_2 \times 2 + \dots + d_9 \times 9 \] 3. 计算 \( S \mod 11 \),得到余数 \( M \)。 4. 如果 \( M = 10 \),校验码为字母“X”;如果 \( M = 11 \),校验码为数字“0”;否则,校验码为 \( N = 11 - M \)。 #### 3. 实现方法 以下是一个Python程序示例,用于生成和校验ISBN号码: ```python def calculate_isbn_checksum(isbn): isbn = isbn.replace('-', '') # 去掉分隔符 if len(isbn) != 9 or not isbn.isdigit(): return "Invalid ISBN format" total = sum((i + 1) * int(digit) for i, digit in enumerate(isbn)) remainder = total % 11 checksum = 'X' if remainder == 10 else (11 - remainder) % 11 return checksum def validate_isbn(isbn): isbn_parts = isbn.split('-') if len(isbn_parts) != 4: return "Invalid ISBN format" checksum_digit = isbn_parts[-1].upper() calculated_checksum = calculate_isbn_checksum('-'.join(isbn_parts[:-1])) if checksum_digit == calculated_checksum: return "Right" else: corrected_isbn = '-'.join(isbn_parts[:-1]) + '-' + str(calculated_checksum) return corrected_isbn # 示例输入 isbn_input = "0-670-82162-4" result = validate_isbn(isbn_input) print(result) ``` 上述代码实现了以下功能: 1. **`calculate_isbn_checksum`**:计算给定ISBN号码的校验码[^3]。 2. **`validate_isbn`**:验证输入的ISBN号码是否正确,若不正确则输出正确的ISBN号码[^2]。 #### 4. 输入输出示例 假设输入为“0-670-82162-4”,程序将输出“Right”。如果输入为“0-670-82162-5”,程序将输出正确的ISBN号码“0-670-82162-4”。 #### 5. 注意事项 - 确保输入的ISBN号码符合标准格式,即包含9位数字和1位校验码,并用“-”分隔。 - 校验码可以是数字或字母“X”[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值