진짜 머리 터지는 줄 알았던 credit 과제..

아직 내가 정말 이해했는지 확신도 없지만 기록 & 복습 용으로 남겨놓으려 해용 

 

 

<What to do>

  1. Prompt credit card number (has to be > 0, using get_long())
  2. Calculate Checksum (digits * 2 & digit not multiplied by 2 - seperately)
  3. Check for card length & starting digits (identify if it's VISA, AMEX, or MASTER)
  4. 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에 적어보면 아래와 같습니다!

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

int main(void)
{
long card;
// Prompt card number which is over 0
do
{
card = get_long("Card No: ");
}
while (card < 0);

int card1, card2, card3, card4, card5, card6, card7, card8, card9, card10, card11, card12, card13, card14, card15, card16;

// Identify digits multiplied by 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;

// Identify each digit of card1~8
card1 = (card1 % 100 / 10) + (card1 % 10);
card2 = (card2 % 100 / 10) + (card2 % 10);
card3 = (card3 % 100 / 10) + (card3 % 10);
card4 = (card4 % 100 / 10) + (card4 % 10);
card5 = (card5 % 100 / 10) + (card5 % 10);
card6 = (card6 % 100 / 10) + (card6 % 10);
card7 = (card7 % 100 / 10) + (card7 % 10);
card8 = (card8 % 100 / 10) + (card8 % 10);

//Identify digits that are not multiplied by 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;

//Identify each digit of card9~16
card9 = (card9 % 100 / 10) + (card9 % 10);
card10 = (card10 % 100 / 10) + (card10 % 10);
card11 = (card11 % 100 / 10) + (card11 % 10);
card12 = (card12 % 100 / 10) + (card12 % 10);
card13 = (card13 % 100 / 10) + (card13 % 10);
card14 = (card14 % 100 / 10) + (card14 % 10);
card15 = (card15 % 100 / 10) + (card15 % 10);
card16 = (card16 % 100 / 10) + (card16 % 10);

//Sumup
int sum1, sum2, sum3;
sum1 = card1 + card2 + card3 + card4 + card5 + card6 + card7 + card8;
sum2 = card9 + card10 + card11 + card12 + card13 + card14 + card15 + card16;
sum3 = sum1 + sum2;

//Check if the last digit of sum3 == 0
int length = 0;
if ((sum3 % 10) != 0)
{
printf("%s\n", "INVALID");
return 0;
}

//Length ++
long visa = card;
long amex = card;
long master = card;


while (card > 0)
{
card = card / 10;
length++;
}

//Check for the starting digit(s) of VISA and print if it's valid
while (visa >= 10)
{
visa /= 10;
}
if (visa == 4 && (length == 13 || length == 16))
{
printf("%s\n", "VISA");
return 0;
}

//Check for the starting digit(s) of AMEX and print if it's valid
while (amex >= 10000000000000)
{
amex /= 10000000000000;
}
if ((amex == 34 || amex ==37) && length == 15)
{
printf("%s\n", "AMEX");
return 0;
}

//Check for the starting digit(s) of MASTER and print if it's valid
while (master >= 100000000000000)
{
master /= 100000000000000;
}
if ((master == 51 || master == 52 || master == 53 || master == 54 || master == 55) && length == 16)
{
printf("%s\n", "MASTERCARD");
return 0;
}
else
{
printf("%s\n", "INVALID");
return 0;
}
}

 

 

  체크해보니 에러가 없다고 드디어 뜨네요... 이래봬도 수정 한 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

+ Recent posts