※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24309번 문제인 РАВЕНСТВО이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/24309 

 

24309번: РАВЕНСТВО

Учителката по математика дала на учениците да намерят неизвестното x от равенството: a·x = b-c. Числата а, b и c са естествени числа и са такива, ч

www.acmicpc.net

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

+ Recent posts