※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |