Я пытаюсь написать программу, в которой пользователь вводит 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 is not правильной». Что-то не так с моей логикой.
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;
}
Читайте 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
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.