https://www.acmicpc.net/problem/10757
수의 범위가 long long의 범위도 넘어가는 경우에는 문자열로 구현해주어야 한다.
이 문제를 풀어놓으면 활용해서 풀 수 있는 문제들이 꽤 있다. (1914 하노이탑, 2407 조합, 10826 피보나치 수 4 등)
15353번 큰 수 A + B (2) 문제는 아예 똑같은 코드로 풀 수 있다.
먼저 문자열 두 개를 입력받았으면 덧셈을 해주기 위해서 자릿수를 맞춰주어야 한다.
길이를 비교하고 길이가 더 짧은 곳에 0을 붙여준다.
예를 들어 123456과 123456789이라면 123456 앞에 두 수의 길이의 차이인 3만큼 0을 붙여줘서 000123456을 만들어준 후에 덧셈을 진행한다.
각각의 자리에서 더해주고 9보다 큰 값이 있다면 다음 자릿수의 덧셈에서 1을 더 더해준다.
이런 식으로 정답 문자열에 붙여주면 거꾸로 되므로 마지막에 문자열을 뒤집어준다.
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
string a, b;
string ans = "";
cin >> a >> b;
int n = a.length() - 1;
int m = b.length() - 1;
//자릿수 맞춰준다.
string tmp = "";
if (n < m) {
for (int i = 0; i < m - n; i++) {
tmp += "0";
}
a = tmp + a;
}
else if (n > m) {
for (int i = 0; i < n - m; i++) {
tmp += "0";
}
b = tmp + b;
}
int len = a.size(); //자릿수 위에서 맞춰줬으므로 길이 아무거나 상관없음
int x, y, z;
int up = 0;
//1의 자리부터 진행
for (int i = len - 1; i >= 0; i--) {
x = a[i] - '0';
y = b[i] - '0';
z = x + y;
if (up == 1) {
z += 1;
up = 0;
}
if (z > 9) {
ans += to_string(z % 10);
up = 1;
}
else {
ans += to_string(z);
}
}
if (up == 1) ans += "1";
reverse(ans.begin(), ans.end());
cout << ans << '\n';
return 0;
}
Colored by Color Scripter
|
'BOJ' 카테고리의 다른 글
[BOJ] 18808. 스티커 붙이기 (0) | 2020.03.23 |
---|---|
[BOJ] 17822. 원판 돌리기 (0) | 2020.03.16 |
[BOJ] 1331. 나이트 투어 (0) | 2020.03.03 |
[BOJ] 4179. 불! (0) | 2020.02.17 |
[BOJ] 1938. 통나무 옮기기 (0) | 2020.02.12 |