진짜 머리 터지는 줄 알았던 credit 과제..
아직 내가 정말 이해했는지 확신도 없지만 기록 & 복습 용으로 남겨놓으려 해용
<What to do>
- Prompt credit card number (has to be > 0, using get_long())
- Calculate Checksum (digits * 2 & digit not multiplied by 2 - seperately)
- Check for card length & starting digits (identify if it's VISA, AMEX, or MASTER)
- Printf which card it is & if it's valid or invalid
1. Prompt credit card number
int main(void)
{
do
{
long card = get_long("Card No: ");
}
while (card < 0);
☆ do~while 을 사용해서 card number가 0보다 크도록 설정해주기
☆ 숫자가 크기 때문에 get_long function 사용해주기
2. Calculate Checksum
카드 각 digit의 숫자를 판별하고, Luhn's Algorithm 을 사용해서 2로 곱하거나 곱하지 않고 더해야 함
EX) Card No: 4003600000000014
4 0 0 3 6 0 0 0 0 0 0 0 0 0 1 4
=> 밑줄 친 부분은 2를 곱해서 각 digit을 더하고, 밑줄 치지 않은 부분은 그냥 각 digit을 더해서 두 가지의 합의 last digit == 0 이면 됨
ⓐ 각 digit에 이름 붙이기
card8 card16 card7 card15 card6 card14 card5 card13 card4 card12 card3 card11 card2 card10 card1 card9
ⓑ 각 digit 숫자 판별법
| last digit | card를 10으로 나눈 나머지 | card % 10 |
| second-to-last digit | card를 100으로 나눈 나머지 / 10으로 나눈 몫 | (card %100) / 10 |
| third-to-last digit | card를 1000으로 나눈 나머지/ 100으로 나눈 몫 | (card %1000) / 100 |
| fourth-to-last digit | card를 10000으로 나눈 나머지/ 1000으로 나눈 몫 | (card %10000) / 1000 |
...
first digit까지 구할 수 있음
ⓒ-1) 2로 곱해야 하는 밑줄 친 숫자들 판별 *2
| card1 | (card %100) / 10 *2 |
| card2 | (card %10000) / 1000 *2 |
| card3 | (card %1000000) / 100000 *2 |
| card4 | (card %100000000) / 10000000 *2 |
| card5 | (card %10000000000) / 1000000000 *2 |
| card6 | (card %1000000000000) / 100000000000 *2 |
| card7 | (card %100000000000000) / 10000000000000 *2 |
| card8 | (card %10000000000000000) / 1000000000000000 *2 |
ⓒ-2) 각 자릿수의 digit을 더해야 하므로 각 digit을 구하면
| card1 | (card1 % 100) / 10 + (card1 % 10) |
| card2 | (card2 % 10000) / 1000 + (card2 % 1000) |
| card3 | (card3 % 1000000) / 100000 + (card3 % 100000) |
| card4 | (card4 % 100000000) / 10000000 + (card4 % 10000000) |
| card5 | (card5 % 10000000000) / 1000000000 + (card5 % 1000000000) |
| card6 | (card6 % 1000000000000) / 100000000000 + (card6 % 100000000000) |
| card7 | (card7 % 100000000000000) / 10000000000000 + (card7% 10000000000000) |
| card8 | (card8 % 10000000000000000) / 1000000000000000 + (card8 % 1000000000000000) |
ⓓ 2로 곱하지 않는, 밑줄 치지 않은 숫자들 판별
| card9 | card % 10 |
| card10 | (card %1000) / 100 |
| card11 | (card %100000) / 10000 |
| card12 | (card %10000000) / 1000000 |
| card13 | (card %1000000000) / 100000000 |
| card14 | (card %100000000000) / 10000000000 |
| card15 | (card %10000000000000) / 1000000000000 |
| card16 | (card %1000000000000000) / 100000000000000 |
ⓔ sum 구하기 & sum의 조건
sum1 = card1 + card2+ card3 + card4 + card5 + card6 + card7 + card8
sum2 = card9 + card10 + card11+ card12 + card13 + card14 + card15 + card16
sum3 = sum1 + sum2
=> sum3의 last digit == 0이어야 함
=> if (sum3 % 10) != 0, then the card is invalid
☆ != : 같지 않으면
3. Check for card length & starting digit
| Card | No. of digits | Starts with |
| VISA | 13 or 16 | 4 |
| AMEX | 15 | 34, 37 |
| MASTERCARD | 16 | 51,52,53,54,55 |
ⓐ VISA
first digit = keep divide by 10 until remainder < 10 (while loop)
while (visa >= 10)
{
visa /= 10;
}
ⓑ AMEX
first 2 digits = divide by 10000000000000 (13 zeros)
while (amex >= 10000000000000)
{
amex /= 10000000000000)
}
ⓒ MASTER
first 2 digits = divide by 100000000000000 (14 zeroes)
while (master >= 100000000000000)
{
master /= 100000000000000)
}
4. Printf which card it is & if it's valid or invalid
ⓐ VISA
if (visa == 4 && (length == 13 || length == 16))
{
printf("%s\n", "VISA");
return 0;
}
ⓑ AMEX
if ((amex == 34 || amex == 37) && length == 15)
{
printf("%s\n", "AMEX");
return 0;
}
ⓒ MASTER
if ((master == 51 || master == 52 || master == 53 || master == 54 || master == 55) && length == 16)
{
printf("%s\n", "MASTERCARD");
return 0;
}
ⓓ If invalid
else
{
printf("%s\n", "INVALID");
return 0;
}
이제 위의 코드들을 종합해서 VS Codespace에 적어보면 아래와 같습니다!
체크해보니 에러가 없다고 드디어 뜨네요... 이래봬도 수정 한 500번 함..

그럼 안뇽...
Week 1 이 이렇게 어려우면 다음주부터는 어떻게 될까~ 하하하
'CS50' 카테고리의 다른 글
| [CS50] Week 2 Review (2) | 2024.09.23 |
|---|---|
| [CS50] Week 1 Section + Pset 1 : Mario-more (0) | 2024.09.15 |
| [CS50] Week 1 Review (1) | 2024.09.10 |
| [CS50] Week 0 Review (2) | 2024.08.28 |
| [CS50] 코딩 공부 시작 (0) | 2024.08.18 |