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

 

이번에 볼 문제는 백준 15707번 문제인 exceed or not이다.
문제는 아래 링크를 확인하자.

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

 

15707번: exceed or not

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

www.acmicpc.net

a와 b중 적어도 하나가 0이라면 두 수의 곱은 0이 된다. 그렇지 않은 경우를 생각해보자.

 

r의 범위가 \(2^{63}\) 미만이므로 두 수중 하나가 \(2^{63}\)와 같거나 그보다 크다면 문제의 답은 "overflow"가 될 것이다.

 

그렇지 않다면 두 수는 stoll 함수를 통해 64비트 정수자료형으로 저장할 수 있다. gcc의 __int128 자료형을 이용해 128비트 정수의 곱셈으로 ab와 r의 값을 비교해 문제를 해결하자.

 

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

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
typedef __int128 lll;
string s1, s2; ll R;

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

	cin >> s1 >> s2 >> R;

	if (s1[0] == '0' || s2[0] == '0') {
		cout << 0;
		return 0;
	}
	if (s1.length() > 19 || (s1.length() == 19 && s1 > "9223372036854775807") || s2.length() > 19 || (s2.length() == 19 && s2 > "9223372036854775807")) {
		cout << "overflow";
		return 0;
	}

	if ((lll)stoll(s1) * (lll)stoll(s2) > (lll)R) cout << "overflow";
	else cout << stoll(s1) * stoll(s2);
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2379 // C++] 트리 탐색하기  (0) 2023.07.18
[BOJ 1344 // C++] 축구  (0) 2023.07.17
[BOJ 2705 // C++] 팰린드롬 파티션  (0) 2023.07.15
[BOJ 2759 // C++] 팬케이크 뒤집기  (0) 2023.07.14
[BOJ 2708 // C++] 폴리큐브의 겉넓이  (0) 2023.07.13

+ Recent posts