ISBN码验证(类)

ISBN码验证(类)

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:278            测试通过:175

描述

 

10位数的ISBN系统是由组号、出版者号、书序号、校验号四部分组成的,比如0-901690-54-6,变为13位数的ISBN就是在10位数的ISBN前面加上3位EAN(欧洲商品编号)的图书产品代码978。这样,上面的ISBN编号就变成了五部分,如978-0-901690-54-6。校验号的重新计算,也将根据对前面的12位数而不是9位数的计算而得出。13位数的系统与10位数的系统是完全兼容的。

10位数ISBN的结构

      现行的ISBN由10位数字组成,这10位数字由4组数字组成,中间用“-”相连,每组数字都有不同的含义。
      第一组号码是地区号,又叫组号,最短的只有一位数字,最长的达五位数字,大体上兼顾文种、国别和地区。0、1代表英语,使用这两个代码的国家有:澳大利亚、加拿大、爱尔兰、新西兰、波多黎各、南非、英国、美国、津巴布韦等;2代表法语,法国、卢森堡以及比利时、加拿大和瑞士的法语区使用该代码;3代表德语,德国、奥地利和瑞士德语区使用该代码;4是日本出版物的代码;5是俄罗斯出版物的代码;7是中国出版物使用的代码。
      第二组: 出版社代码。由国家或地区的ISBN中心设置并分给各个出版社。
      第三组:书序码。该出版物代码,是出版者分配给每一个出版物的编号。
      第四组:计算机校验码。校验码是ISBN号的最后一位数值,它能够校验出ISBN号是否正确。校验码只能是1位数,当为10时,记为罗马数字X。

  • 校验码的计算方法

  1. 假设某ISBN号码前11位是:7-309-04547;     
  2. 计算加权和S:S=7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2 = 226;     
  3. 计算S÷11的余数M:M = 226 mod 11 = 6;     
  4. 计算11-M的差N:N = 11 ? 6 = 5    
  • 如果N=10,校验码是字母“X”;     
  • 如果N=11,校验码是数字“0”;     
  • 如果N为其他数字,校验码是数字N。    

所以,本书的校验码是5

13位ISBN的最后一位校验位的加权算法与10位ISBN的算法不同。具体算法是:用1分别乘ISBN的前12位中的奇数位,用3乘以偶数位,成绩之和以10为模,用10减去此模,即可得到校验位的值,其值范围应该为0-9

  1. 假设某13位ISBN号码前15位(包含‘-’符号)是:987-7-309-04547;     
  2. 位置为123-4-567-89(10)(11)(12)     
  3. 计算加权和S:S=9×1+8×3+7×1+7×3+3×1+0×3+9×1+0×3+4×1+5×3+4×1+7×3 = 117;     
  4. 计算S÷10的余数M:M = 117 mod 10 = 7;     
  5. 计算10-M的差N:N = 10 -7 = 3     (如果10-M的值为10则校验码取0)
  6. 所以,本书的13位ISBN的校验码是3

输入一个13位ISBN代码,验证其代码的正确性。

n如果正确,则输出“YES”,否则输出错误信息“NO”。

程序必须采用类的方法完成,程序中必须含有和使用三个基本类成员函数:input()输入数据,computer()计算结果,show()显示结果,函数的返回值和参数根据需要自己可以确定需要与否,如果不用类的方法或没有使用上面的函数,该题不给分。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[20]="01234567890";
class node
{
public:

    void input();
    void computer();
    void show();
private:
    char aa[20];
    int sum,t,n;
};
void node::input()
{
    gets(aa);
}
void node::computer()
{
    int i,len,k;
    sum=0;
    len=strlen(aa);
    for(i=0,k=1;i<15;i++)
    {
        if(aa[i]>='0'&&aa[i]<='9')
        {
            if(k%2!=0)
            {
                sum+=aa[i]-'0';
            }
             if(k%2==0)
            {
                sum+=(aa[i]-'0')*3;
            }
            k++;
        }
    }
    sum=sum%10;
    n=10-sum;
}
void node::show()
{
    if(a[n]==aa[16])
        printf("YES\n");
    else
    {
        printf("NO\n");
    }
}
int main()
{
    node t;
    t.input();
    t.computer();
    t.show();
    return 0;
}

输入

每行一个测试数据,表示一个13位ISBN的号码(包含‘-’符号)。

输出

根据验证规则,计算其正确性,如果正确,则输出“YES”,否则输出错误信息“NO”。

样例输入

978-7-302-08599-7

样例输出

YES
代码如下:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值