credit
Max Av#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
long long number;
// --- цикл зобов'язує ввести ціле позитивне число
do
{
printf("Number: ");
number = get_long_long();
}
while (number <= 0);
int numberSize = 0, checkSum = 0, firstDigits;
// --- присвоєння тимчасовій змінній значення введеного номера картки
long long numberCheck = number;
// --- знаходження довжини номера картки
while (numberCheck)
{
numberCheck /= 10; // те ж саме, що: numberCheck = numberCheck / 10
numberSize++; // те ж саме, що: numberSize = numberSize + 1
};
// --- цикл для знаходження контрольної суми
for (int i = 1; i < numberSize; i += 2)
{
// виділення конкретної цифри шляхом ділення на divider
long long divider = pow(10, i);
// виділення цифри, яку потрібно множити на 2 (кожна друга з кінця)
long long multiplyDigit = (number / divider) % 10 * 2,
// виділення цифри, що стоїть на одну позицію лівіше
digit = (number / (divider * 10)) % 10;
// додавання до контрольної суми чисел, помножених на 2
// якщо отримане число (multiplyDigit) більше 9 - відняти від нього 9
if (multiplyDigit > 9)
{
checkSum += multiplyDigit - 9; // те ж саме, що:
// checkSum = checkSum + multiplyDigit - 9
}
else
{
checkSum += multiplyDigit;
};
// додавання до контрольної суми інших цифр (кожна перша з кінця)
checkSum += digit;
};
// додавання останньої цифри номеру картки
checkSum += number % 10;
// --- знаходження перших двох цифр номеру картки
firstDigits = number / pow(10, numberSize - 2);
// --- перевірка на валідність картки (контрольна сума повинна бути кратною 10)
if (checkSum % 10 == 0)
{
// якщо картка починається на 34 або 37 і її довжина = 15 цифр - це AMEX
if ((firstDigits == 34 || firstDigits == 37) && numberSize == 15)
{
printf("AMEX\n");
}
// якщо картка починається на 51, 52, 53, 54 або 55 і її довжина = 16 цифр - це MASTERCARD
else if (firstDigits >= 51 && firstDigits <= 55 && numberSize == 16)
{
printf("MASTERCARD\n");
}
// якщо картка починається на 4 і її довжина = 13 або 16 цифр - це VISA
else if (firstDigits >= 40 && firstDigits <= 49 && (numberSize == 13 || numberSize == 16))
{
printf("VISA\n");
}
// інакше це невідомий формат (але контрольна сума валідна)
else
{
printf("UNKNOWN FORMAT\n");
};
}
// виведення INVALID, якщо контрольна сума не валідна
else
{
printf("INVALID\n");
};
return 0;
};