한다 공부
[C++] 백준 알고리즘 10757번 큰 수 A+B 본문
수의 합이어서 쉬운문제인줄 알았는데
입력값의 범위가 10의 10000승이기 때문에
숫자로 값을 받으면 안된다
그래서 문자열로 받음,,!
뒷자리수부터 더하려니 복잡해져서
역순으로 하고
더하고
다시 되돌렸다
1234
+
12
의 경우
4321
+
21
을 하고
원래대로 돌렸다.
그런데 문자열 길이가 다르면
에러가 나기 때문에
4321
+
2100
이런식으로 문자 0을 추가했다.
반올림 값도 고려해야함.
그것은 carry로!
#include<iostream>
#include<algorithm>
using namespace std;
string add(string a, string b) {
//역순으로 해서 끝자리부터 더해주기
//1234
//+
// 12 의 경우
//4321
//+
//21 로 변경, 자리 수 다를 경우 번거로워서..
reverse(a.begin(),a.end());
reverse(b.begin(), b.end());
string c;
string max;
//4321
//+
//21 의 경우
//4321
//+
//2100 으로 변경
//역순된거이므로 실제로 계산값 차이X
//원래대로라면 1234+12 -> 1234+0012로 변경한 것
int z;
if (a.length() < b.length()) {
for (z = a.length(); z < b.length(); z++)
a += '0';
max = b;
}
else {
for (z = b.length(); z < a.length(); z++)
b += '0';
max = a;
}
//반올림 여부
bool carry = false;
int i, n;
for (i = 0; i < max.length(); i++) {
//끝자리 더해주기 끼리
if (carry == true) {
n = a[i] - '0' + b[i] - '0' + 1;
}
else
n = a[i] - '0' + b[i] - '0';
//반올림값 있으면 +1
if (n >= 10) {
c += n % 10 + '0';
//05+08의 경우 031이어야 함 (역순이므로)
//즉 마지막 계산의 경우 문자열 끝에 '1'더하기
if (i == max.length() - 1)
c += '1';
carry = true;
}
else {
c += n + '0';
carry = false;
}
}
reverse(c.begin(), c.end());
return c;
}
int main() {
string a, b;
cin >> a >> b;
cout << add(a,b) << '\n';
}
'Algorithm > 문제풀이' 카테고리의 다른 글
[C++] 백준 알고리즘 1764번 듣보잡 (0) | 2021.09.12 |
---|---|
[C++] 백준 알고리즘 19363번 요요 시뮬레이션 (0) | 2021.09.12 |
[C++] 백준 알고리즘 11651번 좌표 정렬하기 2 (0) | 2021.09.09 |
[C++] 백준 알고리즘 1431번 시리얼 번호 (0) | 2021.09.09 |
[C++] 백준 알고리즘 1316번 그룹 단어 체커 (0) | 2021.09.09 |