계산기코어 2.1 뜯어보기 6강. 거듭제곱, 팩토리얼, 순열

안녕하세요? noname01입니다.
이번 글에서는 정수끼리의 지수 연산(거듭제곱)과 팩토리얼, 그리고 순열을 계산하는
트리거를 살펴봅시다.(순열은 따로하려 했는데 거듭제곱과 팩토리얼이 너무 간단해서
하나로 묶었습니다.) 사실 제곱근 이후의 연산들은 알고리즘이랄것도 없이 그 연산의
정의대로 계산하므로 따로 알고리즘에 대한 설명은 하지 않도록 하겠습니다.

정수끼리의 지수연산 즉 거듭제곱의 정확한 정의는 아니지만 일반적으로 A^B라고 하면
"1에다가 A를 B번 곱한다" 라고 할 수 있습니다. 그러므로 우리는 X에 먼저 1을 대입한 뒤,
X값에다가 A를 B번 곱하도록 트리거를 짜면 되겠죠?? 자 그럼 이 연산을 순서대로 수행하기
위해 호출해야 하는 트리거들을 살펴봅시다.



◎시작

  X   : X=1;
  X   : ①동작




  X   : B값을 비교한다.
     B값이 0 이하일 경우 ②동작
     B값이 1 이상일 경우 ③동작


------------------------------------------------


  X   : 계산완료 및 초기화
------------------------------------------------
------------------------------------------------


8^9 * 1 : a=A;
8^8 * 2 : b=X;
8^6 * 4 : X=t=0;
8^6 * 1 : X=a*b;  t=a;  a=b=0;
  X   : --B;  //B값을 1 감소시킵니다.
  X   : ①동작
------------------------------------------------


뭐 달리 설명할 것도 없이 간단합니다. 실제 트리거도 한번 살펴봅시다.

50-30 : 거듭제곱을 연산하기 위한 트리거

자 그러면 팩토리얼도 한번 살펴봅시다. 팩토리얼의 정의는 다음과 같습니다.

n! = n * (n-1) * (n-2) * … * 3 * 2 * 1

이 정의대로 계산하려면 거듭제곱과 마찬가지로 X에 1을 대입한뒤, X값에다가, A를 1씩 줄여
가면서 A가 1이 될때까지 곱해주면 되겠죠?? 이 과정을 수행하기 위해 호출해야 하는 트리거
들을 살펴봅시다.



◎시작

  X   : X=1;
  X   : ++A;  //A값을 1 증가시킵니다. [주1]
  X   : ①동작




  X   : A값을 비교한다.
     A값이 1 이하일 경우 ②동작  //어차피 1은 곱하나 마나 이므로 바로 계산완료
     A값이 2 이상일 경우 ③동작


------------------------------------------------


  X   : 계산완료 및 초기화
------------------------------------------------
------------------------------------------------


  X   : --A;  //A값을 1 감소시킵니다. [주1]
8^9 * 1 : a=A;
8^8 * 2 : b=X;
8^6 * 4 : X=t=0;
8^6 * 1 : X=a*b;  t=a;  a=b=0;
  X   : ①동작
------------------------------------------------


[주1] 호출하지 않고 제어변수쪽에서 직접 작동시키는 "--A"와 같은
    액션은 호출 트리거 아래에 넣더라도 먼저 동작을 합니다. 즉 항상 A를 먼저 1만큼
    감소시킨 뒤에 곱셈을 수행하므로 처음 시작할때 A에 1을 더해주지 않으면 A!을
    계산하는것이 아니라 (A-1)!을 계산하게 됩니다.


감소시키고 비교하는 값이 B가 아니라 A인 점과 곱셈을 시작하기 전에 A에 1을 더해주는 것만
제외하면 거듭제곱과 거의 유사한 것을 알 수 있습니다. 실제 트리거도 한번 살펴봅시다.

50-31 : 팩토리얼을 연산하기 위한 트리거

그럼 마지막으로 순열을 살펴봅시다. 사실 순열도 거듭제곱이나 팩토리얼이랑 상당히 비슷
합니다.(간단하죠.) 곱하는 방식은 팩토리얼처럼 A값을 1 씩 줄여가며 곱하고 곱하는 횟수는
거듭제곱처럼 B번 곱합니다.

하지만 순열은 항상 A값이 B값보다 같거나 커야 한다는 조건이 있으므로 이 조건을 만족
하는지 검사하는 부분이 추가됩니다.

※참고로 순열의 정의는 다음과 같습니다.

nPr = n! / (n-r)!

자 그럼 순열을 계산하기 위해서 호출해야 하는 트리거들을 살펴봅시다.



◎시작

------------------------------------------------


8^9 * 1 : a=A;
8^8 * 1 : b=B;
8^7 * 3 : x=compare(&a, &b);
  X   : ②동작
------------------------------------------------




  X   : x값을 비교한다.
     x의 값이 2 이하일 경우 ③동작  //a >= b 인 경우로 이상없음
     x의 값이 3 이상일 경우 ④동작  //a < b 인 경우로 오류발생


------------------------------------------------


  X   : X=1;
  X   : ⑥동작
------------------------------------------------
------------------------------------------------


  X   : 오류처리를 위해 C값을 996으로 점프  //오류코드는 2강 참고
------------------------------------------------
------------------------------------------------
⑤  //[주2]

  X   : --A;  //A를 1 감소시킵니다.
  X   : ⑥동작
------------------------------------------------




  X   : B값을 비교한다.
     B값이 0 이하일 경우 ⑦동작
     B값이 1 이상일 경우 ⑧동작


------------------------------------------------


  X   : 계산완료 및 초기화
------------------------------------------------
------------------------------------------------


8^9 * 1 : a=A;
8^8 * 2 : b=X;
8^6 * 4 : X=t=0;
8^6 * 1 : X=a*b;  t=a;  a=b=0;
  X   : --B;  //B값을 1 감소시킵니다.
  X   : ⑤동작
------------------------------------------------


[주2] 여기서도 팩토리얼을 계산할때와 비슷한 문제가 생기는데, 시작할때
    A에 1을 더해 주는 대신에 제어변수를 이용하여 강제로 곱셈이 끝난 후에 A가 감소
    되도록 만들었습니다.


오류를 점검하는 부분을 제외하면 거듭제곱과 팩토리얼을 섞어놓은듯한 구성을 보입니다.
실제 트리거도 한번 살펴봅시다.

50-32 : 순열을 연산하기 위한 트리거

이렇게 거듭제곱, 팩토리얼, 순열을 계산하는 트리거들을 살펴보았습니다. 다음 강에서는
조합을 계산하는 트리거를 살펴봅시다.




[50]계산기코어 2.1 뜯어보기 1강. 전체구조와 호출방식
[50]계산기코어 2.1 뜯어보기 2강. 오류와 입력처리
[50]계산기코어 2.1 뜯어보기 3강. 덧셈, 뺄셈, 곱셈
[50]계산기코어 2.1 뜯어보기 4강. 나눗셈
[50]계산기코어 2.1 뜯어보기 5강. 제곱근
[50]계산기코어 2.1 뜯어보기 6강. 거듭제곱, 팩토리얼, 순열
[50]계산기코어 2.1 뜯어보기 7강. 조합
[50]계산기코어 2.1 뜯어보기 8강. 난수 생성




다른 맵 제작 팁을 보려면 이 이미지를 클릭해 주세요.