본문으로 바로가기

쉬운 농부 알고리즘

category 프로그래밍 언어/알고리즘 2018. 9. 24. 19:54

러시아 농부 알고리즘

 

러시아 농부 알고리즘 말로만 들었을 때는 이게 뭐지?? 할 겁니다 ㅋㅋ.

 

러시아어로 a la russe algorithm이라 불립니다.

 

두 정수의 곱셉을 하기 위한 또다른 알고리즘인데요.

 

러시아의 한 농부가 곱셈이 나타나기 전에 곱셈이 필요했답니다.

 

그래서 러시아 농부 곱셈 알고리즘이라고 불리는거죠.

 

이 알고리즘은 이집트 곱셈법과 많이 비슷한 형태를 취하고 있습니다.

 

방법에 대해 말해보자면

우선 두 정수를 첫 번째 열과 두 번째 열에 각각 씁니다.

 

첫 열에 숫자를 2로 나누고 몫을 두 번째 행의 첫 열에 쓰고

 

두 번째 열에있는 숫자를 2를 곱하여 만약 첫 열의 숫자가 홀수라면

 

세 번째 열에 2를 곱한 수를 써줍니다.

 

이렇게 첫 열 숫자가 1이 될 때까지 반복하여 세 번째 열에 있는 숫자를 다 더해줍니다.

 

이 값이 바로 두 정수를 곱한 결과입니다.

 

27 곱하기 82를 보죠.

 

 

첫 열 

두 번째 열 

세 번째 열 

첫 행 

27 홀

82 

82 

두 번째 행 

13 홀

164

164 

세 번째 행 

6 짝

328 

네 번째 행

3 홀

656 

656 

다섯 번째 행 

1 홀

1312 

1312 

 

빨간 색 숫자를 다 더해주면 2214로 27x82의 결과와 동일합니다.

 

제가 이 코드를 직접 짜봤습니다.

 

#include <stdio.h>

//이정찬 농부 알고리즘

int main(int argc,char **argv)
{
 //곱할 두 정수
 int a=27;
 int b=82;
 int first_result=a; // 첫 번째 열 담을 변수
 int second_result=b;// 두 번째 열 담을 변수
 int third_result=b;//세 번째 열 즉 더할 값들 담을 변수

 while(1)
 {
  first_result=first_result/2;//2로 나눈 몫을 담는다.
  second_result=second_result*2;//두 번째 열에 2를 곱한다.
  if(first_result%2==1)//첫 열이 홀수라면 세 번째 열 두 번째 열을 담는다.
  {
   third_result+=second_result;
    //세 번째열을 축적해서 더해준다.
  }
  if(first_result==1) //만약에 첫 열이 1이라면 종료
   break;

 }
 printf(" 농부 알고리즘 곱셈 결과:%d", third_result);
}

간단하지요?? 코드는 한번 분석 해보시기 바랍니다.

 

'프로그래밍 언어 > 알고리즘' 카테고리의 다른 글

백준 보물문제 풀이  (0) 2019.02.17
숫자 순환 알고리즘  (0) 2019.01.04
동전 옮기기(알고리즘)  (0) 2018.08.24
기약 분수 구하기  (1) 2018.08.23
수학 식 이용 알고리즘  (0) 2018.08.17