Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 지갑
- bip39
- 블록체인
- C++
- Storybook
- Mnemonic
- SASS
- priority queue
- baekjoon
- algorithm
- frontend
- scss
- 코딩
- 니모닉
- 프로그래밍
- 기본수학1단계
- 알고리즘
- 우선순위 큐
- Blockchain
- 기본 수학 2단계
- three.js
- 백준
- 에러
- React
- 리액트
- SVG
- TypeScript
- Console
- 스토리북
- 풀이
Archives
- Today
- Total
Moong
[백준 10757번][C++] 백준 큰 수 A+B 본문
10757번: 큰 수 A+B
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)
출력
첫째 줄에 A+B를 출력한다.
풀이
Algorithm
- C++에서 최대로 범위가 큰 정수type은 unsigned long long인데, 그조차 범위가 0 ~ 4,294,967,295밖에 되지 않아요. 문제에서 요구하는 범위보다 한참 모자라죠!
- 그렇다면 A, B를 문자열로 받아야겠죠?!
- while문을 끝까지 돌게 하기 위해 두 수의 길이를 통일시켜줘요
- 방법은 예를 들면 12345, 1로 입력받았을 경우 뒤의 수를 00001로 만들어주면 되겠죠?
- 이처럼 temp2 변수를 이용하여 작은 수의 앞부분에 A.length()-B.length()만큼 0으로 채워줘요
- 이제 두 문자열의 문자를 뒤에서부터 하나씩 읽어와서 더해주고, 그 결과를 차례로 result에 저장해요
- 읽어온 문자를 int type으로 바꿔준 후 연산을 하고 temp 변수에 저장해줘요 temp = (int)A[i]+(int)B[i]-96+flag;
- 여기에서 96을 빼주는 이유는 : char을 int로 바꿔주게 되면 ascii code로 변환돼요. '0'의 ascii code가 48이기 때문에 실제 나타내는 숫자는 48을 빼준 값이에요. 따라서 A에서 읽어온 문자를 실제 숫자로 변환해주면 ((int)A[i]-48)이고, B에서 읽어온 문자를 실제 숫자로 나타내면 ((int)B[i]-48)이에요! 이 두 개를 더해주면 정수부분이 합쳐져서 -96이 되겠죠?
- 여기에서 또 flag를 더해주는 이유는 : flag는 바로 직전 아랫자리에서 더한 수에 올림이 있었는지 나타내는 bool type 변수예요. 올림 수가 있으면 true인 1이 더해지고, 그렇지 않으면 false인 0이 더해지겠죠?
- 다음 자릿수의 덧셈을 위해 flag를 재설정해줘요. 덧셈한 결과를 10으로 나눈 몫이 1이면 올림수가 있다는 뜻이겠죠? flag = (temp/10==1);
- i를 계속 하나씩 줄여나가면서 while문을 도는 동안 문자열에 있는 문자를 뒤에서부터 차례로 모두 읽어오게 해요
- while문을 빠져나온 후 최고자릿수의 덧셈에 올림수가 발생했는지 확인해줘요
- 만일 있었으면 result 앞에 1을 붙여줘야겠죠?
- 예를 들면 99+1의 경우 while문을 빠져나왔을 때 result는 00이고, flag는 1일거예요. 최고 자릿수의 올림수는 while문을 빠져나와서 다시 또 처리해주어야 해요. result 앞에 1을 더해줘서 '1'+"00" = "100"을 해줘요!
- result를 출력하면 끝!!
추가 입력 출력 예시
입력 | 출력 |
0 0 | 0 |
0 1 | 1 |
1 0 | 1 |
99 1 | 100 |
1 99 | 100 |
code
#include <iostream>
#include <string>
using namespace std;
int main() {
int i, temp;
string A, B, temp2, result = "";
bool flag = 0;
cin >> A >> B;
// 길이 맞춰주기
if (A.length() > B.length()) {
i = A.length() - 1;
temp2.resize(A.length() - B.length(), '0');
temp2 += B;
B = temp2;
}
else {
i = B.length() - 1;
temp2.resize(B.length() - A.length(), '0');
temp2 += A;
A = temp2;
}
// 덧셈
while (i >= 0) {
temp = (int)A[i] + (int)B[i] - 96 + flag; // flag는 올림이 있으면 1을 더해주는 역할
result = (char)(temp % 10 + 48) + result;
flag = (temp / 10 == 1);
i--;
}
if (flag)
result = '1' + result;
cout << result << '\n';
return 0;
}
'Baekjoon' 카테고리의 다른 글
[Baekjoon-2581번][C++] 백준 소수 (0) | 2021.01.14 |
---|---|
[백준 1978번][C++] 백준 소수 찾기 (0) | 2021.01.14 |
[백준 1011번][C++] 백준 Fly me to the Alpha Centauri (0) | 2021.01.14 |
[백준 10757번][C++] 백준 설탕 배달 (0) | 2021.01.11 |
[백준 10250번][C++] 백준 ACM 호텔 (0) | 2021.01.07 |
Comments