끄적끄적 코딩
article thumbnail
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를 출력해줍니다.

 

<c++ />
#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

검색 태그