

https://www.acmicpc.net/problem/17167
[ 문제 요약 ]
두 양수 A, B가 주어졌을 때, "A+=A", "B+=B", "A+=B", "B+=A" 이 네가지 연산을 이용해서 두 수가 동일해지게 하는 연산의 최솟값과 그 연산 순서를 출력한다.
[ 문제 풀이 ]
1. 계속 더하는 연산은 숫자가 계속 커지기 때문에 오버플로우가 날 수 있다.
2. 따라서 "A+=A", "B+=B" 연산은 반대로 생각해서 "A/=2", "B/=2"로 연산하더도 문제가 없다.
3. A와 B가 만약 모두 홀수라면 큰 수에 작은 수를 더한다.
4. 두 수가 똑같아지면 종료한다.
[ 소스 코드 ]
#include <bits/stdc++.h>
using namespace std;
string A[4] = {"A+=A", "B+=B", "A+=B", "B+=A"};
vector<int> v;
int main() {
long long a, b;
cin >> a >> b;
while (a!=b){
if(b%2==0) {b/=2; v.push_back(0);}
else if (a%2==0) {a/=2; v.push_back(1);}
else if (a>b) {a+=b; v.push_back(2);}
else {b+=a; v.push_back(3);}
}
cout << v.size() << "\n";
for (int i=0; i<v.size(); i++) cout << A[v[i]] << "\n";
return 0;
}
[ 주의할 점 ]
큰 수에서 작은 수를 더해야지 반복문이 종료되기 때문에 주의해야 한다.
'백준' 카테고리의 다른 글
| [ 백준 14233 ] 악덕 사장 (c/c++) (0) | 2024.09.30 |
|---|---|
| [ 백준 28449 ] 누가 이길까 (c/c++) (1) | 2024.09.29 |
| [ 백준 2470 ] 두 용액 (c/c++) (0) | 2024.09.26 |
| [ 백준 11877 ] 홍수 (c/c++) (1) | 2024.09.25 |
| [ 백준 13018 ] 특이한 수열 (c/c++) (0) | 2024.09.24 |