Credit: 課題

課題は、クレジットカードの発行元とチェックディジットを使って正しいクレジットカード番号が入力されているかを確認するプログラムを書くこと。

https://cs50.harvard.edu/x/2021/psets/1/credit/

 

Credit: 回答例

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

int main(void)
{
    // Promt for input
    long n;

    do
    {
        n = get_long("Number: ");
    }
    while (n < 0);

    // Calculate checksum
    int checksum = 0;

    // 2nd digit
    checksum += (((n / 10) % 10) * 2) / 10;
    checksum += (((n / 10) % 10) * 2) % 10;

    // 4th digit
    checksum += (((n / 1000) % 10) * 2) / 10;
    checksum += (((n / 1000) % 10) * 2) % 10;

    // 6th digit
    checksum += (((n / 100000) % 10) * 2) / 10;
    checksum += (((n / 100000) % 10) * 2) % 10;

    // 8th digit
    checksum += (((n / 10000000) % 10) * 2) / 10;
    checksum += (((n / 10000000) % 10) * 2) % 10;

    // 10th digit
    checksum += (((n / 1000000000) % 10) * 2) / 10;
    checksum += (((n / 1000000000) % 10) * 2) % 10;

    // 12th digit
    checksum += (((n / 100000000000) % 10) * 2) / 10;
    checksum += (((n / 100000000000) % 10) * 2) % 10;

    // 14th digit
    checksum += (((n / 10000000000000) % 10) * 2) / 10;
    checksum += (((n / 10000000000000) % 10) * 2) % 10;

    //16th digit
    checksum += (((n / 1000000000000000) % 10) * 2) / 10;
    checksum += (((n / 1000000000000000) % 10) * 2) % 10;

    // 1st digit
    checksum += n % 10;

    // 3rd digit
    checksum += (n / 100) % 10;

    // 5th digit
    checksum += (n / 10000) % 10;

    // 7th digit
    checksum += (n / 1000000) % 10;

    // 9th digit
    checksum += (n / 100000000) % 10;

    // 11th digit
    checksum += (n / 10000000000) % 10;

    // 13th digit
    checksum += (n / 1000000000000) % 10;

    // 15th digit
    checksum += (n / 100000000000000) % 10;

    // Identify credit card issuer
    if (checksum % 10 == 0 && (n / 1000000000000000) % 10 == 5
        && (n / 100000000000000) % 10 >= 1
        && (n / 100000000000000) % 10 <= 5)
    {
        printf("MASTERCARD\n");
    }
    else if (checksum % 10 == 0 && (n / 1000000000000) % 10 == 4)
    {
        printf("VISA\n");
    }
    else if (checksum % 10 == 0 && (n / 1000000000000000) % 10 == 4)
    {
        printf("VISA\n");
    }
    else if (checksum % 10 == 0 && (n / 100000000000000) % 10 == 3 && (n / 10000000000000) % 10 == 4)
    {
        printf("AMEX\n");
    }
    else if (checksum % 10 == 0 && (n / 100000000000000) % 10 == 3 && (n / 10000000000000) % 10 == 7)
    {
        printf("AMEX\n");
    }
    else
    {
        printf("INVALID\n");
    }
}