0

我正在尝试编写一个程序,其中用户输入 ISBN 然后检查条目的准确性。国际标准书号是0201702894. 校验位(第 4 位)由其他 9 位计算得出,如下所示 - (每个位的总和乘以它的位置)模 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;
  }
4

2 回答 2

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 的数组。

于 2013-04-19T15:41:52.890 回答
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
于 2013-04-19T15:53:55.573 回答