※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 24309번 문제인 РАВЕНСТВО이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/24309
a*x=b-c를 만족하는 정수 x를 찾는 문제이다.
b와 c의 크기 제한이 10^100으로 매우 크다. 큰 수의 덧셈과 뺄셈을 구현해 b-c의 값을 계산하자. 문제 조건에서 b>c로 주어져있으므로 계산 결과가 양수라 가정해도 좋다. 단, 글을 작성하는 시점 기준으로 b=c인 채점 데이터도 섞여있으니 참고해 구현하자.
10^18 이하의 정수는 부호있는 64비트 정수 자료형으로 나타낼 수 있고 a는 10^17 이하이므로, 나눗셈은 복잡하게 구현할 필요 없이 아래의 코드와 같이 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a; string b, c;
string bc;
string ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> a >> b >> c;
reverse(b.begin(), b.end());
reverse(c.begin(), c.end());
int len = b.length();
while (c.length() < len) c += '0';
bool carry = 0;
for (int i = 0; i < len; i++) {
int cur = (int)(b[i] - '0') - (int)(c[i] - '0');
if (carry) cur--;
if (cur < 0) cur += 10, carry = 1;
else carry = 0;
bc += (char)(cur + '0');
}
reverse(bc.begin(), bc.end());
ll tmp = 0;
for (int i = 0; i < len; i++) {
tmp = tmp * 10 + (int)(bc[i] - '0');
char nxt = (tmp / a) + '0'; tmp %= a;
if (nxt == '0' && ans == "") continue;
ans += nxt;
}
if (ans == "") cout << 0;
else cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 25527 // C++] Counting Peaks of Infection (0) | 2022.11.11 |
---|---|
[BOJ 2228 // C++] 구간 나누기 (0) | 2022.11.11 |
[BOJ 11008 // C++] 복붙의 달인 (0) | 2022.11.10 |
[BOJ 25859 // C++] Sort by Frequency (0) | 2022.11.10 |
[BOJ 25785 // C++] Easy-to-Pronounce Words (0) | 2022.11.10 |