Я пытаюсь реализовать алгоритм Луна на языке C, чтобы проверить действительность кредитной карты, для тех, кто не знает ... вот оно:
Умножьте все остальные цифры на 2, начиная с предпоследней цифры номера, а затем сложите цифры этих продуктов.
Добавьте сумму к сумме цифр, которые не были умножены на 2.
Если последняя цифра суммы равна 0 (или, выражаясь более формально, если сумма
по модулю 10 сравнима с 0), число действительно!
и чтобы реализовать это, я перебрал все число, и если бы в числовом месте, в котором я находился, был модуль 2, равный 0, я бы умножил его на два и добавил бы к переменной с именем totalEven
.
если бы это было не так, я бы добавил число, в котором я был, к totalOdd
без умножения.
Затем я увеличивал бы это место на единицу и проверял остальные числа, пока не достигну 16 (максимальное количество цифр для карты).
Позже я бы добавил обе переменные и проверил, равняется ли сумма по модулю десять нулю. Если это означает, что номер кредитной карты правильный, иначе это ложь.
вот код:
#include <stdio.h>
#include <cs50.h>
//list of variables
//is the card valid
bool isValid = true;
// the creditcard number
long input;
//mod stands for modules, and is used to single out each number as seen later
int mod = 10;
//the location at which number I am checking
int place = 1;
//num is the number I am checking that has been singled out
int num = 0;
//total of numbers * 2 located at locations numbered with even numbers
int totalEven = 0;
//total of numbers located at locations numbered with odd numbers
int totalOdd = 0;
//gets input and stores it in well.. input
input = get_long("Number: ");
// a formula to single out a number, starting with the ones and then as you can see, mod is muliplied by 10 to go over the second number.
num = ((input % mod) - (input % (mod /10))) / (mod/10);
//loops 16 times
for(int i = 0; i < 16; i++)
{
// if the place is even execute below
if(place % 2 == 0)
{
totalEven = totalEven + num * 2;
}
//else do this
else if (place % 2 != 0)
{
totalOdd = totalOdd + num;
}
//moves to the next number
mod = mod * 10;
place++;
}
//fufils the last step of the algorithm
if((totalEven + totalOdd) % 10 == 0 )
{
isValid = true;
}
else
{
isValid = false;
}
проблема в том, что этот блок кода дает мне недействительный или !isValid
, хотя номер кредитной карты должен быть правильным, и я проверил свою формулу, и она работает нормально ...
Я совершенно не знаю, что делать ... Я скромный любитель, так что, пожалуйста, не жарьте меня за чудовищность выше.
вот полная версия кода
#include <stdio.h>
#include <cs50.h>
long power();
int main(void)
{
//AMERX 15 STRT 34 OR 37
//MC 16 STRT 51, 52, 53, 54, 55
//VZA 13 OR 16 STRT 4
long input;
bool isValid = true;
string type;
int mod = 10;
int place = 1;
int num = 0;
int totalEven = 0;
int totalOdd = 0;
do
{
input = get_long("Number: ");
}
while(input < 0);
for(int i = 0; i < 16; i++)
{
num = ((input % mod) - (input % (mod /10))) / (mod/10);
if(place % 2 == 0)
{
totalEven = totalEven + num * 2;
}
else
{
totalOdd = totalOdd + num;
}
mod = mod * 10;
place++;
}
if((totalEven + totalOdd) % 10 == 0 )
{
isValid = true;
}
else
{
isValid = false;
printf("%i , %i", totalEven, totalOdd);
}
if (isValid == true){
if((input < (38 * power(10, 13)) && input >=(37 * power(10, 13))) || (input < (35 * power(10,13)) && input >= (34 * power(10, 13))))
{
type = "AMEX\n";
}
else if(input >= (51 * power(10, 14)) && input < (56 * power(10, 14)))
{
type = "MASTERCARD\n";
}
else if((input < (5 * power(10, 12)) && input >= (4 * power(10, 12))) || (input < (5 * power(10, 15)) && input >= (4 * power(10, 15))))
{
type = "VISA\n";
}
else{
type = "error\n";
}
}
else
{
type = "INVALID\n";
}
if((totalEven + totalOdd) % 10 == 0 )
{
isValid = true;
}
else
{
isValid = false;
}
printf("%s", type);
}
long power(int n, int p)
{
long result = 1;
for(int i = 0; i<p; i++)
{
result = result * n;
}
return result;
[cs50] luhn
". - person Jonathan Leffler   schedule 07.08.2020mod/10
составляет всего 10/10, а это всего лишь 1, поэтому я подозреваю, что есть ошибка в `num = ((input% mod) - (input% (mod / 10))) / (mod / 10);`. Хотя это значительно медленнее, я считаю, что манипуляциями со струнами будет легче осознать. - person Daniel Farrell   schedule 07.08.2020long
на вашем компьютере для 16 цифр? Попробуйте#include <limits.h>
иprintf("%ld\n", LONG_MAX);
- person pmg   schedule 07.08.2020"221b Baker Street"
, и телефонными номерами, такими как"0123456789"
, где ведущее начало0
было бы потеряно. - person Weather Vane   schedule 07.08.2020input
было 1069, аmod
было 10, тогдаnum
было бы .... `num = ((1069% 10) - (1069% (10/10))) / (10/10); число = (9 - (1069% 1) / 1); число = (9 - 0/1); число = 9; `тогда, как вы можете видеть, если вы посмотрите на код более глубоко,mod
умножается на 10, чтобы перейти к следующей цифре - person someGuy5864   schedule 07.08.2020for
цикле? - person Daniel Farrell   schedule 07.08.2020