credit

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;

};