https://cs50.harvard.edu/x/2023/psets/1/credit/
Credit - CS50x 2023
Harvard University's introduction to the intellectual enterprises of computer science and the art of programming.
cs50.harvard.edu
pseudocode (의사코드)
데이터 입력 Number : = (card_number)
int d_1 = (card_number % 10000000000000000) / 1000000000000000
int d_3 = (card_number % 100000000000000) / 10000000000000
int d_5 = (card_number % 1000000000000) / 100000000000
int d_7 = (card_number % 10000000000) / 1000000000
int d_9 = (card_number % 100000000) / 10000000
int d_11 = (card_number % 1000000) / 100000
int d_13 = (card_number % 10000) / 1000
int d_15 = (card_number % 100) / 10
int d_2 = (card_number % 1000000000000000) / 100000000000000
int d_4 = (card_number % 10000000000000) / 1000000000000
int d_6 = (card_number % 100000000000) / 10000000000
int d_8 = (card_number % 1000000000) / 100000000
int d_10 = (card_number % 10000000) / 1000000
int d_12 = (card_number % 100000) / 10000
int d_14 = (card_number % 1000) / 100
int d_16 = (card_number % 10) / 1
int odd_sum = (d_1 + d_3 + d_5 + d_7 + d_9 + d_11 + d_13 + d_15)
int even_sum = (d_2 + d_4 + d_6 + d_8 + d_10 + d_12 + d_14 + d_16)
int check_cum = ((odd_sum * 2) + even_sum) % 10
-> 나중에 보니 이게 아니라, 각각 2를 곱해서 각 자릿수를 더하는거였다. 코드에서는 수정함.
(예를들어 어떤 자리가 6이면 *2 = 12가 되니깐 1,2를 더해서 3이 된다)
if check_sum == 0
if
master card인가? (5600000000000000 > card_number > 5100000000000000)
16visa card인가? (5000000000000000 > card_number > 4000000000000000)
american express인가? (380000000000000 > card_number > 370000000000000)
american express인가? (350000000000000 > card_number > 340000000000000)
visa giftcard인가? (5000000000000 > card_number > 4000000000000)
else
INVALID
else
INVALID
이제 진짜 복잡해져서 의사코드가 필요했다.
각각 지릿수의 숫자값을 가져오는 함수가 있나 찾아봤으나, 역시 없어서, 방법을 인터넷으로 찾아서 적용했다.
int에서 소숫점 아래 자리가 버림되는걸 이용했다.
제출한 코드
#include <cs50.h>
#include <stdio.h>
int odd_digit_sum(int x);
int main(void)
{
long card_number = get_long("Number: ");
int d_1 = (card_number % 10000000000000000) / 1000000000000000;
int d_3 = (card_number % 100000000000000) / 10000000000000;
int d_5 = (card_number % 1000000000000) / 100000000000;
int d_7 = (card_number % 10000000000) / 1000000000;
int d_9 = (card_number % 100000000) / 10000000;
int d_11 = (card_number % 1000000) / 100000;
int d_13 = (card_number % 10000) / 1000;
int d_15 = (card_number % 100) / 10;
int d_2 = (card_number % 1000000000000000) / 100000000000000;
int d_4 = (card_number % 10000000000000) / 1000000000000;
int d_6 = (card_number % 100000000000) / 10000000000;
int d_8 = (card_number % 1000000000) / 100000000;
int d_10 = (card_number % 10000000) / 1000000;
int d_12 = (card_number % 100000) / 10000;
int d_14 = (card_number % 1000) / 100;
int d_16 = (card_number % 10) / 1;
int odd_sum = (odd_digit_sum(d_1) + odd_digit_sum(d_3) + odd_digit_sum(d_5) + odd_digit_sum(d_7) +
odd_digit_sum(d_9) + odd_digit_sum(d_11) + odd_digit_sum(d_13) + odd_digit_sum(d_15));
int even_sum = (d_2 + d_4 + d_6 + d_8 + d_10 + d_12 + d_14 + d_16);
int check_sum = (odd_sum + even_sum) % 10;
if (check_sum == 0)
{
if (5600000000000000 > card_number && card_number > 5100000000000000)
{
printf("MASTERCARD\n");
}
else if (5000000000000000 > card_number && card_number > 4000000000000000)
{
printf("VISA\n");
}
else if (380000000000000 > card_number && card_number > 370000000000000)
{
printf("AMEX\n");
}
else if (350000000000000 > card_number && card_number > 340000000000000)
{
printf("AMEX\n");
}
else if (5000000000000 > card_number && card_number > 4000000000000)
{
printf("VISA\n");
}
else
{
printf("INVALID\n");
}
}
else
{
printf("INVALID\n");
};
}
int odd_digit_sum(int x)
{
int second_digit = ( x * 2 ) / 10;
int sum = ( ( x * 2 ) % 10 ) + second_digit;
return sum;
}
너무 수식이 길어져서 함수를 따로 빼내서 작성했다.
좀더 짧게 할 방법이 있을것 같은데, 우선은 이렇게 까지 정리해보았다.