Простая проблема логики массива C ++

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

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
0

Другие решения

  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.

2

По вопросам рекламы [email protected]