Проверка номера кредитной карты - PullRequest
0 голосов
/ 18 мая 2019

Я работаю над проблемой кредитования CS50. Тем не менее, я печатаю только INVALID независимо от того, какой номер карты я ввел. Могу я спросить, в чем проблема с моим кодом? Кажется, что-то не так с деталью для расчета общей суммы.

    #include <cs50.h>
    #include <stdio.h>
    #include <math.h>

    int main(void)
    {
        // Get the card number
        long num;
        do 
        {
            num = get_long("What is the card number?\n");
        } while (num < 0);

        long sum = 0, sum2 = 0, count = 0;
        //Get the sum
        for (long i = num; i > 0; i = i / 10)
        {
            sum += i % 10;
            count++;
        }
        for (long i = num / 10; i > 0; i = i / 100)
        {
            sum2 += i % 10;    
        }

        if ((sum + sum2) % 10 != 0) 
        {
            printf("INVALID");
        }
        else 
        {
            long digits = num / (10 * (count - 2));
            if (count == 15 && 
               (digits == 34 || digits == 37)) 
            {
                printf("AMERICAN EXPRESS");
            } 
            else if (count == 16 && 51 <= digits <=55)
            {
                printf("MASTERCARD");
            }
            else if ((count == 16 || count == 13) && (digits / 10) == 4)
            {
                printf("VISA");               
            }
            else 
            {
                printf("INVALID");
            }

        }
    }

1 Ответ

1 голос
/ 18 мая 2019

Это дает сумму каждую цифру.

for (long i = num; i > 0; i = i / 10)
        {
            sum += i % 10;
            count++;
        }

Еще раз рассмотрите поставленную задачу, в частности, обсуждение алгоритма Луна.Есть две суммы, однако они являются «взаимоисключающими».Если цифра добавлена ​​к sum1, она не будет добавлена ​​к sum2.И наоборот.Также в коде заметно отсутствие *2 (раз 2).

Возможно, вы найдете это видео прохождение полезным.Имейте в виду: это из более ранней версии курса и упоминает функцию get_long_long.Это было удалено, используйте get_long, как вы сделали здесь.

...