10757번: 큰 수 A+B
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
풀이
(0 < A,B < 10^10000) 엄청나게 큰 수 이므로 long long, unsigned long long 을 사용해도 풀 수 없다.
참고 https://blog.kimtae.xyz/133
자료형 | 범위 |
int | –2,147,483,648 ~ 2,147,483,647 |
long long | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unsigned long long | 0 ~ 18,446,744,073,709,551,615 |
아이디어
이런 큰 수의 덧셈은 배열을 사용하거나, 문자열을 사용해 풀 수 있다.
나는 문자열을 사용해 풀었다. A와 B를 문자열로 받고, 덧셈 결과를 문자열로 반환한다.
a가 큰 수이든 b가 큰 수 이든 상관없도록 아래와 같이 해주었다.
1
2
3
4
5
6
7
8
9
10
11
|
while (aSize > 0 || bSize > 0) {
int k1 = 0;
if(aSize>0){
k1 = a[--aSize] - '0';
}
int k2 = 0;
if (bSize > 0) {
k2 = b[--bSize] - '0';
}
}
|
cs |
아래는 AC를 받은 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <iostream>
#include <string>
using namespace std;
// 10231435
// 231291
// --------
// 10462726
// 큰 수 덧셈
string big_integer(string& a, string& b) {
int aSize = a.length();
int bSize = b.length();
string rans = "";
int c = 0;
// 뒤에서 부터 계산
while (aSize > 0 || bSize > 0) {
int k1 = 0;
if(aSize>0){
k1 = a[--aSize] - '0';
}
int k2 = 0;
if (bSize > 0) {
k2 = b[--bSize] - '0';
}
int ret = k1 + k2 + c;
c = ret / 10;
ret %= 10;
char cur = ret + '0';
rans += cur;
}
if (c > 0) {
rans += c + '0';
}
string ans = "";
for (int i = (int)rans.length()-1; i >= 0; --i) {
ans += rans[i];
}
return ans;
}
int main(void) {
string a;
string b;
cin >> a;
cin >> b;
cout << big_integer(a, b) << "\n";
return 0;
}
|
cs |
큰 수 덧셈을 사용하여 풀 수 있는 문제
백준 4150번 피보나치 수
'알고리즘 > BOJ' 카테고리의 다른 글
백준 5021 왕위계승 (1) | 2020.08.06 |
---|---|
백준 2961 도영이가 만든 맛있는 음식 (0) | 2020.07.20 |
백준 1757 달려달려 (2) | 2020.07.12 |
백준 17208 카우버거 알바생 (0) | 2020.06.11 |
백준 10775 공항 (1) | 2020.06.08 |