Решение задачи по проверки кредиток
Konstantin Vasilkov

Всем привет. В настоящий момент прохожу гарвардский онлайн курс CS50 по основам програмирования на edx.com. И вот столкнулся с такой задачей. Требуется на языке Си реализовать программу проверки кредиток. Я вроде как худо-бедно написал код, но вот загвоздка в том, что я не правильно (судя по результатам) понимаю как именно должны проверятся номера кредиток.
Вот оригинал задания (части, где объясняется что именно надо сделать с номером, чтобы проверить его валидность):

So what’s the secret formula? Well, most cards use an algorithm invented by Hans Peter Luhn, a nice fellow from IBM. According to Luhn’s algorithm, you can determine if a credit card number is (syntactically) valid as follows:
1. Multiply every other digit by 2, starting with the number’s second-to-last digit, and then add those products' digits together.
2. Add the sum to the sum of the digits that weren’t multiplied by 2.
3. If the total’s last digit is 0 (or, put more formally, if the total modulo 10 is congruent to 0), the number is valid!
That’s kind of confusing, so let’s try an example with Daven’s AmEx: 378282246310005.
For the sake of discussion, let’s first underline every other digit, starting with the number’s second-to-last digit:
378282246310005
1. Okay, let’s multiply each of the underlined digits by 2:
7•2 + 2•2 + 2•2 + 4•2 + 3•2 + 0•2 + 0•2
That gives us:
14 + 4 + 4 + 8 + 6 + 0 + 0
Now let’s add those products' digits (i.e., not the products themselves) together:
1 + 4 + 4 + 4 + 8 + 6 + 0 + 0 = 27
2. Now let’s add that sum (27) to the sum of the digits that weren’t multiplied by 2:
27 + 3 + 8 + 8 + 2 + 6 + 1 + 0 + 5 = 60
Yup, the last digit in that sum (60) is a 0, so Daven’s card is legit!

Самое обидное, что именно этот номер моя программа отрабатывает как надо(((
А вот например 4111111111111111 должно определятся как VISA. Ок. Как это вижу я (и собственно как реализован мой алгоритм)
1) Берем все вторые числа и умножаем каждое на 2 ( 1*2=2, 1*2=2, 1*2=2, 1*2=2, 1*2=2, 1*2=2, 1*2=2, 1*2=2)
2) Складываем все полученные числа (если число бошьше 10 то его разбираем по разрядно и сначала складываем то чтополучилось (напр. 15 = 1 + 5 + 6)). Для нашего условия (2+2+2+2+2+2+2+2 = 16)
3) Складываем все нечетные элементы первоначального числа (4+1+1+1+1+1+1+1 = 11)
4) Складываем результаты двух сложений (16 + 11 = 27)
5) Если результат делится на 10 без остатка — значит это валидная VISA (в нашем примере)
НО 27 никак не делится на 10 без остатка. То есть одно из двух: либо это не валидная ВИЗА, либо я не правильно понимаю алгоритм.

Так же пробовал прогонять через этот алгоритм свои реальные карточки и тоже контрольная сумма никак не делится на 10 без остатка.
Может тут есть те кто сталкивался с этим алгоритмом и подскажет где я не прав? Буду безмерно благодарен)) А то уже неделю бьюсь и никак не могу решить.

Konstantin Vasilkov 9 месяцев назадСпасибо 0
1 чел.