Что не так с моим кодом для проблемы кредита CS50? - PullRequest
0 голосов
/ 31 марта 2020

Почему мой код неверный ?? Я не знаю почему ... Эта проблема состоит в том, чтобы получить номер карты от пользователя и сказать, является ли это действительным номером карты или недействительным номером карты. Это может быть американская карта Express, MasterCard или Visa. Американская Express карта имеет 15 цифр и должна начинаться с 34 или 36, в то время как MasterCard имеет 16 цифр и может начинаться с 51, 52, 53, 54, 55. Карта Visa должна иметь 13 или 16 цифр и должна начинаться с с 4. В этой задаче также используется алгоритм Луна, в котором для проверки правильности номера карты используются все остальные числа, начиная с десятки, умноженной на два, а затем, если добавить цифры, то не их произведение, а только цифры, поэтому, если вы умножите 8 на 2 его 16, поэтому вы должны добавить 1 + 6 и другие числа. Затем, как только вы получите сумму, вы должны добавить их к тем, которые вы не умножили на 2, и, наконец, если их сумма делится на 10, то она действительна. Я действительно не знаю, где я ошибся, я искал свой код почти 3 часа. Также нуб программист здесь ..

#include<stdio.h>

int main(void)
{
    //declare and initialize card number
    long long number = 0;

    //ask user for their credit card number
    do
    {
        printf("Number: ");
        scanf("%lli", &number);
    }
    while (number < 0);

    //declare and initialize a counter for the number of the digits
    int counter = 0;
    long long temp = number;

    //loop to count the number of digits
    while (temp > 0)
    {
        temp /= 10;
        counter++;
    }

    //statement for invalid digits
    if (counter != 13 && counter != 15 && counter != 16)
    {
        printf("Invalid number of digits\n");
    }

    //array to store the digits individually
    int digits[counter];

    // loop to store the digits in the array
    for (int i = 0; i < counter; i++)
    {
        digits[i] = number % 10;
        number /= 10;
    }

    //loop to multiply every other digit by 2
    for (int j = 1; j < counter; j += 2)
    {
        digits[j] *= 2;
    }

    // loop to separate then add digits that are greater than 10
    for (int x = 1; x < counter; x += 2)
    {
        if (digits[x] > 10)
        {
            int s = digits[x] % 10;
            digits[x] /= 10;
            digits[x] = (digits[x] % 10) + s;
        }
    }

    int sum = 0;

    //loop to get the sum of all numbers 
    for (int y = 0; y < counter; y++)
    {
        sum += digits[y];
    }

    sum %= 10;

    switch (sum)
    {
        case '0':
            if (counter == 15 && (digits[14] == 3 && (digits[13] == 4 || digits[13] == 7)))
            {
                printf("American Express\n");
            }
            else if (counter == 16 && digits[15] == 5)
            {
                printf("Master Card\n");
            }
            else if (counter == 13 && digits [12] == 4)
            {
                printf("Visa\n");
            }
            else if (counter == 16 && digits[15] == 4)
            {
                printf("Visa\n");
            }
            break;
        default: 
            printf("Invalid\n");
            break;
    }
}

1 Ответ

0 голосов
/ 31 марта 2020

Есть три ошибки, и мне стыдно, что мне потребовалось так много времени, чтобы определить, в частности, вторую.

  • if (digits[x] > 10) - это разновидность ошибочной ошибки. Вместо Описание алгоритма Луна гласит: Если результат этой операции удвоения больше 9… , значит, это должно быть if (digits[x] > 9).
  • case '0': скорее должно быть case 0:, поскольку sum является целым числом, а не символьным представлением.
  • if (counter == 15 && (digits[14] == 3 && (digits[13] == 4 || digits[13] == 7))) завершается ошибкой, поскольку digits были изменены алгоритмом в место, поэтому 7 стало 5. Мы могли бы написать if (counter == 15 && (digits[14] == 3 && (digits[13] == 4 || digits[13] == 7*2-9))) вместо; то же самое для else if (counter == 16 && digits[15] == 5).
...