[PS] [SC]두 숫자 더하기

main(n) { gets(&n); putchar(n % 85 + 5); }  

위는 일의자리 두 숫자를 더하는 소스이다.

원리는 아래와 같다.

만일 0 0을 입력하면 0이 나오고 4 4를 입력하면 8이 나오는 소스이다.

이해하는데 좀 힘들었는데, 간략하게 한번 설명해보도록 하겠다.

0 0을 입력했을때를 예시로 들어보자

일단 int는 생략이 된것이고,

gets와 putchar같은 함수들은 built-in 함수라 include가 없어도 컴파일러에서 추가해준다.

0 0을 입력하면 int 의 4바이트에

[0][' '][0][\0] 이 입력된다.

즉 10진수로 한바이트씩 보자면

48 32 48 00 이 들어가 있다.

이는 결국 10진수로 변환하면 컴퓨터는 리틀앤디언방식을 사용하므로

481 +
32
256 +
4865536 +
0
16777216 이다. (2^24)

종이에 그려보면 이해가 갈것이다.

마지막 널문자는 제외하고,

즉 우리는 저기서 원하는 숫자만을 추출하려면 256과 65536을 1로만들어야한다.

간단하게 5로 나눈 나머지를 가져오면된다. 하지만

ASCII의 '9' 인 57보다 커야, 결과값에 영향을 미치지 않는다.

즉 57보다 크고 65535 보다 작은데, 저 두수를 나눴을떄 1이 나오는 수중 가장작은 수를 찾으면 85가 나오게된다.

즉(48+32+48)%85는 43이 나오게된다.

만일 0 + 1이였다면

44가 나오게 되겠지

즉 우리는 최종 결과값에서 43을 빼면된다.

main(n){gets(&n);printf("%d",n%85-43);}

을 했을경우는 2자리 까지 출력된다. 만일 한자리의 결과만을 원한다면

ASCII값이 되야하므로 5를 더햐 '0'을만들어 putchar로 출력한다.