Emma
Emma

Reputation: 13

CS50 Luhn's Algorithm in C. Help much appreciated :)

I need to solve the problem on the link below, using Luhn's algorithm and what we have learned so far in CS50 (no arrays).

My program compiles but it doesn't identify the card type. What am I doing wrong?

Many thanks in advance!

Problem: https://cs50.harvard.edu/x/2020/psets/1/credit/#:~:text=check50%20cs50/problems/2020/x/credit

/* This program checks if a bank card number is syntactically valid, using Luhn's algorithm */

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

int main(void)
{
    long long n, temp;
    int digit, last, first, product;
    int lenght = 0;
    int sumOdd, sumEven;


// Prompt user for input as long as the inputted number is equal or smaller than zero

do
 {
    n = get_long_long("Enter your credit card number without special characters:\n");

 } while (n < 0);


// Count the number of digits

while (n > 0)
 {
     n = n/10;
     lenght++;
 }

// Check if the number's length is valid

if (lenght != 13 && lenght != 15 && lenght != 16)
{
    printf("INVALID");
}

// Find the last digit and add it to the even sum

while (n > 0)
{
    last = n % 10;
    temp = n - last;
    sumEven = sumEven + last;

}

/* Starting with second-to-last digit, multiply every other digit by 2. Add those
products together and then add the sum to the sum of the digits that weren't multiplied by 2 */

while (n > 0)

{
    digit = n % 10;
    temp = n/10;

    if (lenght % 2 == 0)
    {
        product = digit * 2;
        sumOdd = sumOdd + product;

    } else

    {
         sumEven = sumEven + digit;

    }

// If the last digit of the sum of sums is zero print the number. Else print INVALID.

    if (sumOdd + sumEven % 10 != 0)
    {
        printf("INVALID\n");

    }
    else
    {
        printf("%lld\n", n);
    }

// Identify the user's card type as per CS50 Credit instructions. Cards commencing with 3 are AMEX, with 5 MasterCard and with 4, VISA.

while (first >= 10)
{
    first = n;
    first = first / 10;

    if (first == 3)
    {
        printf("AMEX\n");
    }

    if (first == 5)
    {
        printf("MASTERCARD\n");
    }

    if (first == 1)
    {
        printf ("VISA\n");
    }

}

}

}

Upvotes: 1

Views: 203

Answers (1)

BigBill
BigBill

Reputation: 40

You have several consecutive while blocks

while (n>0){
   // some code  
}

while (n>0){
   // some code  
}

Your program will only exit the first loop when n is no longer larger than 0. When it reaches the next while loop n will still not be larger than 0 so the body of the next while loop will never be entered. Large chunks of your code are not getting executed.

Upvotes: 1

Related Questions