题目:
国际标准书号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;
}