CS50 pset 1 кредит (длинный разделенный на число) - PullRequest
1 голос
/ 02 августа 2020

Я сейчас изо всех сил пытаюсь решить вопрос. Однако я столкнулся со следующей проблемой:

После проверки суммы я хочу проверить первые 2 цифры номера карты. поэтому я использую следующий метод:

int main(void)
{
  long long ccn;
  do
  {
    ccn = get_long_long("Credit Card No.:\n");
  }
  while (ccn < 0);
  int ccn_len;
  long long count = ccn;
  long long bccn = ccn;
  for (ccn_len = 0; count != 0; ccn_len++, count /= 10);
    int sum = 0; //checksum
    for (int i = 0; i < ccn_len; ccn /= 10, i++) 
    {
      if (i % 2 == 0)
      {
        sum += ccn % 10;
      }
      else
      {
        int digit = (ccn % 10) * 2;
        sum += digit / 10 + digit % 10;
      }
    }
    if (sum % 10 != 0) 
    {
      printf("INVALID");
    }
    else
    {
      int a = bccn / 1e13;
      if ((bccn / 1e13 == 34 || bccn / 1e13 == 37) && ccn_len == 15)
      {
        printf("AMERICAN EXPRESS");
      }
      else if (bccn / 1e12 == 4 && ccn_len == 13)
      {
        printf("VISA");
      }
      else if (ccn_len == 16)
      {
        if (bccn / 1e15 == 4)
        {
          printf("VISA");
        }
        if (bccn / 1e14 > 50 || bccn / 1e14 < 56)
        {
          printf("MASTERCARD");
        }
      }
      else
      {
        printf("INVALID");
      }
    }
  }
}

Допустим, это действующая карта AE: 378282246310005 с длиной 15 цифр

В приведенном выше коде я использую ccn / 1e13, чтобы получить первые две цифры, чтобы проверить, 34 или 37.

Однако после проверки контрольной суммы вывод все еще показывает INVALID.

Я пытаюсь использовать другой метод, я устанавливаю переменную a и a = ccn / 1e13, а затем я вставляю в оператор if:

if ((a == 34 || a == 37) || ccn_len == 15)

на этот раз все работает нормально.

Кто-нибудь может сказать мне, что не так с моим кодом? Или как мне лучше писать?

Мы очень ценим ваши ответы.

1 Ответ

0 голосов
/ 02 августа 2020

1e13 - это константа с плавающей запятой с типом double. В bccn / 1e13 bccn преобразуется в double, а затем выполняется деление с плавающей запятой, в результате получается число, например 37,82822463100050214279690408147871494293212890625. Тогда bccn / 1e13 == 37 оценивается как ложное, потому что 37.82822463100050214279690408147871494293212890625 не равно 37.

Перепишите свой код, чтобы использовать только целочисленные арифметики c (не используйте константы с плавающей запятой, такие как 1e13) или для обработки кредитной карты «Числа» в виде цепочек цифр, а не целых чисел.

...