문제
두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.
출력
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를,둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
유클리드 호제법(- 互除法, Euclidean algorithm)
2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. *출처 : 위키백과
간략한 예제를 살펴보자 두 숫자 78696과 19332가 있다.
두개의 숫자를 나눈 나머지 값으로 작은 값을 계속 %로 계산하고 있다 나머지가 0이라면 최대공약수가 된다.
78696 = 19332×4 + 1368
19332 = 1368×14 + 180
1368 = 180×7 + 108
180 = 108×1 + 72
108 = 72×1 + 36
72 = 36×2
최소공배수는 두 숫자를 곱한다음 최대공약수로 나눠주면 된다 !
import java.util.Scanner; public class CommonNumber { static int a,b; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); a = scan.nextInt(); b = scan.nextInt(); if (b > a) { int temp = b; b = a; a = temp; } int result = gcd(a,b); System.out.println(result); System.out.println(a * b / result); } public static int gcd(int a, int b) { if(a%b==0) return b; return gcd(b, a%b); } }
'알고리즘 및 자료구조 > 문제' 카테고리의 다른 글
백준알고리즘 1009번 분산처리 (1) | 2016.04.29 |
---|---|
백준알고리즘 1003번 피보나치 함수 (0) | 2016.04.29 |
백준알고리즘 1965번 상자넣기 (0) | 2016.04.20 |
algospot Koogle (0) | 2016.04.18 |
백준알고리즘 4435번 중간계 전쟁 (0) | 2016.04.05 |