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

 

#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

검색 태그