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

 

이번에 볼 문제는 백준 22937번 문제인 교수님 계산기가 고장났어요!이다.
문제는 아래 링크를 확인하자.

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

 

22937번: 교수님 계산기가 고장났어요!

C++17, C11, C99, C++98, C++11, C++14, C++20, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang), C++20 (Clang)

www.acmicpc.net

초등학생 때 소수를 곱했던 경험을 살려 생각해보면, 두 소수의 곱셈은 소수점 없는 두 정수의 곱셈을 계산한 뒤 소수점을 적절한 위치에 표기하는 것으로 할 수 있다.

 

주어지는 소수의 절댓값이 4 이하이고 40억 이하의 두 정수의 곱셈의 결과는 부호 없는 64비트 정수자료형으로 나타낼 수 있으므로, 주어진 소수를 부호 없는 64비트 정수로 변환해 곱하는 방식으로 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;
typedef unsigned long long ll;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	while (T--) {
		int sgn = 0;
		string s1, s2; cin >> s1 >> s2;
		if (s1[0] == '-') {
			sgn ^= 1;
			s1 = s1.substr(1, 11);
		}
		if (s2[0] == '-') {
			sgn ^= 1;
			s2 = s2.substr(1, 11);
		}

		ll n1 = (ll)(s1[0] - '0') * 1000000000 + stoi(s1.substr(2, 9));
		ll n2 = (ll)(s2[0] - '0') * 1000000000 + stoi(s2.substr(2, 9));

		string ans = to_string(n1 * n2);
		while (ans.length() < 18) ans = "0" + ans;

		if (sgn & 1) cout << '-';
		if (ans.length() > 18) cout << ans.substr(0, ans.length() - 18) << '.' << ans.substr(ans.length() - 18, 18) << '\n';
		else cout << 0 << '.' << ans << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 9776 // C++] Max Volume  (0) 2023.02.03
[BOJ 24622 // C++] Blocks  (0) 2023.02.03
[BOJ 27297 // C++] 맨해튼에서의 모임  (0) 2023.02.02
[BOJ 9780 // C++] Range Sum Query  (0) 2023.02.02
[BOJ 27294 // C++] 몇개고?  (0) 2023.02.02

+ Recent posts