第5章 数组 第12题

题目:

国际标准书号ISBN用来唯一标识一本合法出版的图书。它由十位数字组成。这十位数字分成4个部分。例如,0-07-881809-5。其中,第一部分是国家编号,第二部分是出版商编号,第三部分是图书编号,第四部分是校验数字。一个合法的ISBN号,10位数字的加权和正好能被11整除,每位数字的权值是它对应的位数。对于0-07-881809-5,校验结果为(0×10+0×9+7×8+8×7+8×6+1×5+8×4+0×3+9×2+5×1) % 11 = 0。所以这个ISBN号是合法的。

为了扩大ISBN系统的容量,人们又将十位的ISBN号扩展成13位数。13位的ISBN分为5部分,即在10位数前加上3位ENA(欧洲商品编号)图书产品代码“978”。例如,978-7-115-18309-5。13位的校验方法也是计算加权和,检查校验和是否能被10整除。但所加的权不是对应的位数而是根据一个系数表:1313131313131。对于978-7-115-18309-5,校验的结果是:(9×1+7×3+8×1+7×3+1×1+1×3+5×1+1×3+8×1+3×3+0×1+9×3+5×1)% 10 = 0。

编写一个程序,检验输入的ISBN号是否合法。输入的ISBN号可以是10位,也可以是13位。


代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s;
	int i, len, count = 0, sum = 0;

	cout << "检验输入的ISBN号是否合法" << endl << endl;
	cout << "请输入一个ISBN号:" << endl;
	cin >> s;
	len = s.length();
	cout << endl;
	
	//获取ISBN里有几个数字(去掉-)
	for (i = 0; i < len; ++i)
	{
		if (s[i] != 45) count = count + 1;
	}

	if (count == 10)
	{
		int j = 10;
		
		for (i = 0; i < len; ++i)
		{
			if (s[i] != 45)
			{
				sum = sum + (s[i] - '0') * j;
				j = j - 1;
			}
		}

		if (sum % 11 == 0) cout << "这个10位的ISBN号是合法的";
		else cout << "这个10位的ISBN号不是合法的";
	}

	if (count == 13)
	{
		int tmp = 3;
		
		for (i = 0; i < len; ++i)
		{
			if (s[i] != 45)
			{
				(tmp == 3) ? (tmp = 1) : (tmp = 3);
				sum = sum + (s[i] - '0') * tmp;
			}
		}

		if (sum % 10 == 0) cout << "这个13位的ISBN号是合法的";
		else cout << "这个13位的ISBN号不是合法的";
	}

	cout << endl << endl;
	system("pause");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值