일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 백준위
- Java
- 싸피
- 신문 스크랩
- 코딩테스트
- it 뉴스
- it 이슈
- 구글
- 백준
- 우테코
- IT 트렌드
- 네트워크 관리사
- java 객체지향 프로그래밍
- SSAFYcial
- 네트워크 관리사 2급 실기
- 코딩테스트 연습
- IT 동향
- 네트워크 관리사 2급
- 신문스크랩
- 카카오
- 코테
- SSAFY 7기
- 싸피셜
- 리얼클래스
- python
- KT
- 인앱결제
- SSAFY
- 프로그래머스
- html
- Today
- Total
개발자일걸요..?
2609번 최대공약수와 최소공배수 본문
문제링크 : www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
유클리드 호제법 사용
유클리드 호제법 : 두 수가 서로 상대수를 나눠서 최대공약수를 구하는 알고리즘
예제) 78696과 19332의 최대공약수를 구하는 방법
78696 = 19332×4 + 1368 1
9332 = 1368×14 + 180
1368 = 180×7 + 108
180 = 108×1 + 72
108 = 72×1 + 36
72 = 36×2 + 0
=> 최대공약수 : 72
+)참고
호제법 : ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95
유클리드 호제법 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란
ko.wikipedia.org
최대공약수는 유클리드 호제법으로 구하기, 최소공배수는 (최대공약수*최소공배수 = 두수의 곱) 성질 이용
#include <iostream>
using namespace std;
int gcd(int a, int b) {
int n = 1;
while (b != 0) {
n = a % b;
a = b;
b = n;
}
return a;
}
int main() {
int A = 0;
int B = 0;
cin >> A >> B;
cout << gcd(A, B) << "\n" << (A*B) / gcd(A, B);
}
+) 유클리드 호제법을 알기 이전에 했던 구현인데 백준에서는 계속 틀렸다네요. 어디가 틀린걸까요?
#include <iostream>
using namespace std;
int main() {
int A = 0;
int B = 0;
cin >> A >> B;
int maximum = 1;
long minimum = 1;
for (int i = 2; (i <= A) && (i <= B); i++) {
if ((A%i == 0) && (B%i == 0)) {
maximum *= i;
A /= i;
B /= i;
}
}
minimum = A * B * maximum;
cout << maximum << "\n" << minimum;
return 0;
}
-> 위의 코드의 문제점은 같은 수가 반복되어 약수일 경우 그 부분을 체크할 수 없다는 점이었습니다.
ex) 12와 4의 최대공약수가 4임에도 2를 한번만 체크하기 때문에 최대공약수를 2로 출력했습니다.
이를 수정한 코드는 아래와 같습니다.
#include <iostream>
using namespace std;
int main() {
int A = 0;
int B = 0;
cin >> A >> B;
int maximum = 1;
long minimum = 1;
int i = 2;
while ((i <= A) && (i <= B)) {
if ((A%i == 0) && (B%i == 0)) {
maximum *= i;
A /= i;
B /= i;
}
else {
++i;
}
}
minimum = A * B * maximum;
cout << maximum << "\n" << minimum;
return 0;
}
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
2981번 검문 (0) | 2021.02.13 |
---|---|
1934번 최소공배수 (0) | 2021.02.13 |
5086번 배수와 약수 (0) | 2021.02.11 |
14889번 스타트와 링크 (0) | 2021.02.11 |
1003번 피보나치 함수 (0) | 2021.02.08 |