728x90
A * B가 R보다 큰지 확인하는 문제입니다.
큰 수의 계산을 위해서 string으로 받아서 사칙연산을 해줄 수도 있지만
R은 long long의 범위안에 있다는 것이 쉽게 풀 수 있는 힌트입니다.
먼저 A와 B가 long long 범위안에 있는지 확인하고 넘어갈 시 overflow를 출력합니다.
이는 R은 최대가 long long 범위 안 이기 때문에 A나 B가 하나라도 넘어갈 시
A, B 중 하나가 0이 아닌 이상 A B가 항상 크기 때문입니다.
long long의 범위는 19글자인데 A가 19글자이면 long long의 범위를
넘어가는지 확인하기 위해서 문자열 비교를 합니다.
A.compare("9223372036854775807") > 0를 해서 A > long long 범위보다 큰지 확인합니다.
클 경우 overflow를 아닐 경우 다음으로 넘어갑니다.
이렇게 A, B가 long long 범위보다 작다는게 나왔을 때
A * B >= R 인지 확인을 합니다. (= overflow)
여기서 A * B가 long long 범위를 넘어갈 수 있으므로
A >= (R / B)로 변경해서 계산해줍니다.
참일 경우 overflow를 거짓일 경우 A * B를 출력해줍니다.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
bool compare(string s)
{
if (s.length() > 19) {
return true;
}
else if (s.length() < 19) {
return false;
}
else {
return s.compare("9223372036854775807") > 0;
}
}
int main(int argc, char* argv[])
{
ll r, a, b;
string s1, s2;
cin >> s1 >> s2 >> r;
if (s1 == "0" || s2 == "0") {
cout << "0" << endl;
}
else if (compare(s1) || compare(s2)) {
cout << "overflow" << endl;
}
else {
a = stoll(s1);
b = stoll(s2);
if (a > (r / b)) {
cout << "overflow" << endl;
}
else {
cout << a * b << endl;
}
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 4179번 불! (0) | 2019.11.10 |
---|---|
[C++] 백준 1035번 조각 움직이기 (0) | 2019.11.08 |
[C++] 백준 17626번 Four Squares (0) | 2019.11.07 |
[C++] 백준 2823번 유턴 싫어 (0) | 2019.11.07 |
[C++] 백준 2641번 다각형그리기 (0) | 2019.11.06 |