일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 딥러닝
- 로지스틱회귀
- Andrew Ng
- 코딩
- Spring
- PS
- WebMvcTest
- responsebody
- 백준
- python3
- 쉬운딥러닝
- web
- 정렬
- REST API
- 알고리즘
- DP
- withmockuser
- RequestBody
- 그리디
- Backend
- 스택
- testing
- Spring Data JPA
- C++
- SpringBoot
- 신경망기초
- BOJ
- 책리뷰
- 에라토스테네스의체
- FNN
Archives
- Today
- Total
꾸준히하자아자
[백준]2609번 최대공약수와 최소공배수 c/c++ 본문
728x90
728x90
문제
https://www.acmicpc.net/problem/2609
나의 해결방법
이 문제를 처음봤을땐 우리가 수학으로 푸는 방식으로 자연수 두개가 같은값으로 나눠떨어지지 않을때까지 증가하는 i값으로 구해볼까? 했었는데
ex)
while(1)
if (n % i == 0 && m % i == 0) {
n /= i;
m /= i;
max = max * i;
} //최대공약수 구하기
이러한 방식으로 코드를 짜게 되면 나눠주는 값을 제대로 설정할 수 없었다.
그리고 while문을 빠져나가야할 조건을 생각해내지 못하였다.
유클리드 호제법으로 풀어야한다!
유클리드 알고리즘은 주어진 두 수 사이에 존재하는 최대공약수(GCD)를 구하는 알고리즘이다.
ex) 1112, 695의 최대공약수 구하기
1. 큰수를 작은 수로 나눈 나머지를 구한다. (mod연산을 한다)1112 % 695 = 417
2. 나누었던 수와 나머지로 mod연산을 한다.695 % 417 = 278
3. 과정을 계속 반복한다.417 % 278 = 139
` 278 % 139 = 0'
--> 139가 최대공약수가 된다.
코드
#include<iostream>
using namespace std;
int gcd(int a, int b)
{
int c= a % b;
while (c != 0) {
a = b;
b = c;
c= a % b;
}
return b;
}
int main() {
int p, q;
cin >> p >> q;
int g = gcd(p, q);
cout << g << '\n';
cout << (p * q) / g << '\n'; //최소공배수는 최대공약수 x 나머지가 0이될때까지 나눈 두 수
}
728x90
728x90
'개발 > 백준 & 프로그래머스' 카테고리의 다른 글
[백준]1292번 쉽게 푸는 문제 c/c++ (0) | 2022.06.25 |
---|---|
[백준]2693번 N번째 큰 수 c/c++ (0) | 2022.06.25 |
[백준]1789번 수들의 합 c/c++ (0) | 2022.06.25 |
[백준]3460번 이진수 c/c++ (0) | 2022.06.25 |
[백준]2501번 약수구하기 c/c++ (0) | 2022.06.25 |