我正在尝试编写用户输入ISBN的程序,然后检查条目的准确性。 ISBN为0201702894
。校验位(4)从其他9位数字计算如下 - (每个(其位数的数字乘))mod 11 Ex: (0*1 + 2*2 + 0*3 + 1*4 + 7*5 + 0*6 + 2*7 + 8*8 + 9*9)%11 = (0+4+0+4+35+0+14+64+81)%11 = 4 (202/11 = 18 remainder 4)
校验位可以检测何时输入或复制的ISBN不正确。
每次输入值时,我总是输出“ISBN不正确”。我的逻辑出了点问题。
1. Correct Value: 0201702894
2. Incorrect value: 0201702984
代码:
#include <iostream>
using namespace std;
int totalNumbersCheck=0;
int main()
{
int isbnArray[10]; //array to store the ISBN numbers
int ISBN=0; //inputted ISBN number
//user input
cout<<"Please enter the ISBN number: ";
cin>>ISBN;
//ISBN storage
isbnArray[ISBN];
//ISBN calculation
for(int i=0;i<10;i++)
{
totalNumbersCheck=isbnArray[i]*(i+1);
}
//remove last element from array
totalNumbersCheck-=isbnArray[10];
//check if remainder equals last element and output correct response
if(totalNumbersCheck%11==isbnArray[10])
{
cout<<"\nThe ISBN is correct.";
}
else
cout<<"\nThe ISBN is not correct.";
cin.get();
cin.get();
return 0;
}
答案 0 :(得分:2)
isbnArray[ISBN];
是错误的,因为ISBN是一个11位数字,可以从0开始。您希望将ISBN的每个数字存储到数组isbnArray
中。假设输入数字是1233445,该指数肯定超出了isbnArray[9]
的范围。
同时,计算结果的循环可能如下所示:
for(int i=0;i<10;i++)
{
totalNumbersCheck +=isbnArray[i]*(i+1);
}
if(totalNumbersCheck%11==isbnArray[9])
///^^index out of bound again if you access isbnArray[9]
你知道ISBN是11位数,所以你至少应该使用长度为11而不是9的数组。
答案 1 :(得分:0)
将isbn读入std::string
变量,然后遍历字符串中的字符,将每个字符转换为数字,然后应用算法。
const isbn_digits = 10;
std::string isbn;
std::cin >> isbn;
assert(isbn.size() == isbn_digits);
int sum = 0;
for (int pos = 0; pos < isbn_digits - 1; ++pos)
sum += (pos + 1) * (isbn[pos] - '0');
if (sum % 11 != isbn[isbn_digits - 1] - '0')
// error