유클리드 호제법을 한번 알아보았다.

LCM(least common multiple) - 최소 공배수

GCD(Greatest common divisor) - 최대 공약수

주로 LCM과 GCD 문제에서 자주 사용되는데, 그 원리를 알아본다면,

정수의 최대 공약수는 두 수의 공약수 중 가장 큰 수이다.

예를 들어 20과 8 의 최대 공약수는

20의 약수 : 1,2,4,5,10,20

8의 공약 : 1,2,4,8

20과 8의 공약수 : 1,2,4

이중 최대 공약수는 4 이다.

유클리드 호제법에 의하면

20 = 8 * 2 + 4 로 표현 가능하고 20과 8의 공약수는 8과 4의 공약수와 같다고 할 수 있다.

그렇다면 8과 4의 최대 공약수를 구한다면

8 = 4 * 1 + 4

8과 4의 공약수는 4와 4의 공약수와 같다.

결국 20과 8의 최대공약수는 4가 되는 것이다.


그렇다면 최소공배수를 알아보자.

두 수의 최소공배수는 각각의 수의 곱에 대하여 처음으로 공통된 숫자를 찾는것이다.

20과 8을 다시 예로 든다면

20의 배수 = 20,40,60,80...

8의 배수 = 8,16,24,32,40..

20과 8의 최소 공배수  = 40이 된다.

이 또한 잘 생각해보면 처음 수인 20 * 8 의 값에 서로 공통된 약수의 최대값인 최대공약수를 나눠보면 최소공배수가 나온다는 것을 알 수 있다.

20 * 8 = 160 -> 160 / 4 = 40


그럼 이를 코딩에 적용 해본다면...

문제: 두 수의 최대공약수와 최소 공배수를 출력하시오 입력: 두개의 정수 출력: 최대공약수 최소공배수 (주석을 많이 달아놓지 않아서 이해가 힘들지도 모르지만 gcd 재귀함수를 잘 생각해보면 이해가 될것이다.)


Posted by *me
:

(10 ^ 7)! 의 자리수를 어떻게 구할 수 있을까?

- log를 이용하면 자리수를 쉽게 구할 수 있다.

log1010 = 1, 

log10100 = 2,

log101000 = 3

...

이렇게 log는 자리수를 나타 낼 수 있다.

이를 이용하여

팩토리얼의 자리수를 구한다면,

10! 은 1*2*3*4*5*6*7*8*9*10이다.

1*2 = 2;

2*3 = 6

6*4 = 24

24*5 = 120

120 * 6 = 720

720 * 7 = 5040

5040 * 8 = 40320

40320 * 9 = 362880

362880 * 10 = 3628800

이렇게 7자리 수가 된다.

하지만 이렇게 구한다면 10^7 팩토리얼의 자리수인 65657060 자리수를 표현해야한다.

long long형을 사용하여도 9223372036854775807i64(8바이트,64비트)까지 밖에 표현 못한다.

이때 log를 이용하여 팩토리얼 계산시 자리수를 double 형으로 계산한다면 10^7의 값인 천만 팩토리얼의 자리수도 연산가능하다.

(정확히 개념이 이해가 되질 않지만, 일단 적어본다...ㅜㅜ)

Posted by *me
:
Posted by *me
:
Posted by *me
:

문제:http://www.jungol.co.kr/problem.php?ctc=02&id=1175


Posted by *me
:

http://topnanis.tistory.com/147
글래스파이어 참고

먼저 입력받은 1을 -1로 바꿔주고

탐색을 통하여 -1의 위치를 찾아서 함수의 인자로 넘겨준다

함수에서 해당 값은 확인 했다는것을 표시 하기 위해서 같이 넘겨준 인자인 c로 변환시키고

좌 우 하 상 순으로 -1이 있는지 확인을 하고 조건이 만족하면 그값을 체크하기 위해 함수를 다시 호출한다.

재귀를 이용하기 때문에 조건이 맞지 않으면 리턴 되면 이전의 위치에서 다시 비교하게 된다.

이를 반복하면 4방향 좌 하 우 상을 다 검사할 수 있다.

Posted by *me
:
Posted by *me
:
Posted by *me
: