Сортировать каждую цифру строки - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь реализовать алгоритм Луна в C. Моя проблема в том, что мой цикл вообще не работает.

Я пытаюсь разделить его на 10, чтобы отсортировать числа по разным переменным. Для номера 378282246310005 в приведенном ниже примере мне нужно получить: 5 + 0 + 1 + 6 + 2 + 8 + 8 + 3 = 33 (total_odd_numbers).

Затем я умножаю все остальные на 2 (что дает мне 0 + 0 + 6 + 8 + 4 + 4 + 14) и добавляю все их цифры: 0 + 0 + 6 + 8 + 4 + 4 + 1 + 4 = 27 (total_even_numbers).

И, наконец, я складываю четные и нечетные числа и делю сумму на 10. В этом случае 33 + 27 = 60, поэтому мой следующий тест ((60% 10)! = 0) проходит.

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

// Provides the length of credit card number
int length_ccn(long long credit_card_number)
{
    int length = 0;
    while (credit_card_number > 0)
    {
        length++;
        credit_card_number /= 10 ;
    }
    return length;
}


char Luhn_check(long long credit_card_number)
{
    int total_even_numbers = 0;
    int total_odd_numbers = 0;
    int even_number = 0;
    printf("Line 43 worked\n");
    int odd_number = 0;
    int Luhn_sum = 0;
    char Luhn_check = 0;
    char Luhn_validity = 0;
    printf("line 49 executed\n");
    for(int check_digit_basis=credit_card_number ; check_digit_basis > 0 ; check_digit_basis /= 10)
    {
        if ((check_digit_basis % 2) > 0)
        {
            printf("line 53 worked\n");
            odd_number = (check_digit_basis % 10);
            total_odd_numbers = total_odd_numbers + odd_number;
        }
        else
        {
            even_number = (check_digit_basis % 10);
            if(even_number >= 5)
            {
                total_even_numbers = total_even_numbers + ((( 2 * even_number) % 10) + 10 );
                printf("%i", even_number);
            }
            else
            {
                total_even_numbers = total_even_numbers + (2 * even_number);
            }
        }
    }
    Luhn_sum = total_even_numbers + total_odd_numbers;
    if ((Luhn_sum % 10 ) == 0 )
    {
        Luhn_validity = 1;
    }
    else
    {
        Luhn_validity = 0;
    }
    return Luhn_check;
}



int main(void)
{
    printf("Provide your credit card number:\n");
    long long credit_card_number = get_long_long();
    int length = length_ccn(credit_card_number);
    printf("%i\n", length);
    char Luhn_validity = Luhn_check(credit_card_number);
    if(Luhn_validity)
    {
        printf("pass\n");
    }
    else
    {
        printf("INVALID\n");
    }
}

Я просто получаю:

Provide your credit card number:
378282246310005
15
Line 43 worked
line 49 executed
INVALID

Может кто-нибудь сказать мне, почему "строка 53 работала" не отображается?

РЕДАКТИРОВАТЬ: я изменил несколько вещей, и total_odd_numbers кажется правильным, но total_even_number не так.

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

// Provides the length of credit card number
int length_ccn(long long credit_card_number)
{
    int length = 0;
    while (credit_card_number > 0)
    {
        length++;
        credit_card_number /= 10 ;
    }
    return length;
}


char Luhn_check(long long credit_card_number)
{
    int total_even_numbers = 0;
    int total_odd_numbers = 0;
    int even_number = 0;
    printf("Line 43 worked\n");
    int odd_number = 0;
    int Luhn_sum = 0;
    char Luhn_check = 0;
    char Luhn_validity = 0;
    printf("line 49 executed\n");
    long long check_digit_basis = credit_card_number;
    for(int i =1 ; check_digit_basis > 0 ; i++)
    {
        if ((i % 2) > 0)
        {
            printf("line 53 worked\n");
            odd_number = (check_digit_basis % 10);
            total_odd_numbers = total_odd_numbers + odd_number;
            printf("%i total odd\n", total_odd_numbers);
        }
        else
        {
            even_number = (check_digit_basis % 10);
            if(even_number >= 5)
            {
                total_even_numbers = total_even_numbers + ((( 2 * even_number) % 10) + 10 );
                printf("%i test total even\n", total_even_numbers);
            }
            else
            {
                total_even_numbers = total_even_numbers + (2 * even_number);
                printf("%i test total even\n", total_even_numbers);
            }
        }
        check_digit_basis = (check_digit_basis / 10);

    }
    Luhn_sum = total_even_numbers + total_odd_numbers;
    if ((Luhn_sum % 10 ) == 0 )
    {
        Luhn_validity = 1;
    }
    else
    {
        Luhn_validity = 0;
    }
    return Luhn_check;
}



int main(void)
{
    printf("Provide your credit card number:\n");
    long long credit_card_number = get_long_long();

    int length = length_ccn(credit_card_number);
    printf("%i\n", length);
    char Luhn_validity = Luhn_check(credit_card_number);
    if(Luhn_validity)
    {
        printf("pass\n");
    }
    else
    {
        printf("INVALID\n");
    }
}

Я получаю:

Provide your credit card number:
378282246310005
15
Line 43 worked
line 49 executed
line 53 worked
5 total odd
0 test total even
line 53 worked
5 total odd
0 test total even
line 53 worked
6 total odd
6 test total even
line 53 worked
12 total odd
14 test total even
line 53 worked
14 total odd
18 test total even
line 53 worked
22 total odd
22 test total even
line 53 worked
30 total odd
36 test total even
line 53 worked
33 total odd
INVALID

Это намного приятнее, так как total_odd_numbers кажется правильным, но мне интересно, что не так в моей формуле total_even_number.

Я выполнил еще один тест (чтобы получить каждое отдельное значение, которое принимает even_number, делая вывод более четким), я увидел, что программа видит мои четные числа (0, 0, 3, 4, 2, 2, 7), но сложение не правильно ...

Проблема в этой строке:

total_even_numbers = total_even_numbers + ((( 2 * even_number) % 10) + 10 );

Я не могу разделить числа, чтобы получилось 22 + 1 + 5 вместо 22 + 14, которые я получаю.

Редактировать 2:

После нескольких тестов мне удалось увидеть, где моя проблема. Здесь я не вижу, что я делаю неправильно, так как я присваиваю значение Luhn_validity, и оно все еще хочет, чтобы оно было равно 60.

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

// Provides the length of credit card number
int length_ccn(long long credit_card_number)
{
    int length = 0;
    while (credit_card_number > 0)
    {
        length++;
        credit_card_number /= 10 ;
    }
    return length;
}


char Luhn_check(long long credit_card_number)
{

    int total_even_numbers = 0;
    int total_odd_numbers = 0;
    int even_number = 0;
    printf("Line 43 worked\n");
    int odd_number = 0;
    int Luhn_sum = 0;
    char Luhn_check = 0;
    char Luhn_validity = 0;
    printf("line 49 executed\n");
    long long check_digit_basis = credit_card_number;
    for(int i =1 ; check_digit_basis > 0 ; i++)
    {
        if ((i % 2) > 0)
        {
            odd_number = (check_digit_basis % 10);
            total_odd_numbers = total_odd_numbers + odd_number;
        }
        else
        {
            even_number = (check_digit_basis % 10);
            if(even_number >= 5)
            {
                printf("%i >5\n", even_number);
                int testouille = (( 2 * even_number) % 10);
                printf("%i testouille\n", testouille);
                total_even_numbers = total_even_numbers + ((( 2 * even_number) % 10) + 1 );
                printf("%i test total even\n", total_even_numbers);
            }
            else
            {
                printf("%i <5\n", even_number);
                total_even_numbers = total_even_numbers + (2 * even_number);
                printf("%i test total even\n", total_even_numbers);
            }
        }
        check_digit_basis = (check_digit_basis / 10);
    }
    Luhn_sum = total_even_numbers + total_odd_numbers;
    printf("%i", Luhn_sum);
    if ((Luhn_sum % 10 ) == 0 )
    {
        Luhn_validity = 1;
        printf("%c\n", Luhn_validity);
    }
    else
    {
        Luhn_validity = 0;
    }
    return Luhn_check;
}

int main(void)
{
    printf("Provide your credit card number:\n");
    long long credit_card_number = get_long_long();
    int length = length_ccn(credit_card_number);
    printf("%i\n", length);
    char Luhn_validity = Luhn_check(credit_card_number);
    if(Luhn_validity)
    {
        printf("pass\n");
    }
    else
    {
        printf("INVALID\n");
    }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 15 мая 2018

Вы пытаетесь вписать long long в int.Это не будет соответствовать в этом случае.Попробуйте изменить for в строке 32:

for (long long check_digit_basis=credit_card_number ; check_digit_basis > 0 ; check_digit_basis /= 10)

check_digit_basis = (int)(378282246310005LL) может быть отрицательным (-1293252491) в моей системе, в этом случае (check_digit_basis % 2) будет отрицательным.

...