코딩테스트 연습/Baekjoon
[Baekjoon]10757번: 큰 수 A+B (c++)
수기
2022. 2. 14. 13:00
https://www.acmicpc.net/problem/10757
10757번: 큰 수 A+B
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
자릿수가 10의 10000제곱까지 들어올 수 있는 두 수의 합이므로, 숫자 자료형으로는 답을 구할 수 없다. 문자열을 사용해야한다.
1. 입력받은 문자열 a와 b를 거꾸로 뒤집는다.
2. 자릿수가 같지 않다면, 큰 자릿수를 기준으로 0을 추가해서 수를 맞춰준다.
3. 각 자릿수마다 두자리수 이상일때 carry를 1 추가해준다. (다음 반복문에서 사용)
4. a와 b의 자릿수에 -'0'를 해줘서 숫자로 변환하고, carry를 더한다.
5. 10이상 값은 sum%10로 나머지만 result[i]에 넣고, 1은 carry로 넘겨줬으므로 넘어간다.
6. 마지막 carry가 1이면 result의 마지막에 1을 추가한다.
7. 연산한 값을 다시 reverse해서 출력한다.
a와 b를 거꾸로 뒤집어서 계산한 이유는, 캐리가 생길 경우 자릿수가 한자리씩 밀려서 계산이 복잡해지기 때문이다.
거꾸로 계산하면, 마지막 캐리의 자릿수만 신경써주면 된다.
a와 b중에서 큰 값을 기준으로, 자릿수를 맞춰줘야 자릿수별로 계산이 가능해진다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
using namespace std;
void reverse(string &a){
for(int i=0;i<a.length()/2;i++){
char temp = a[i];
a[i] = a[a.length()-1-i];
a[a.length()-1-i] = temp;
}
}
int main()
{
string a, b, c;
char result[10002]={'0'};
int carry = 0;
int len = 0;
cin >> a >> b;
reverse(a);
reverse(b);
if(a.length() > b.length()) len = a.length();
else len = b.length();
while(a.length() != b.length()){
if(a.length() > b.length())b.push_back('0');
else a.push_back('0');
}
for(int i=0;i<len;i++){
int sum = (a[i]-'0' + b[i]-'0') + carry;
if(sum > 9) carry = 1;
else carry = 0;
result[i] = sum%10 + '0';
}
if(carry == 1) result[len] = '1';
for(int i=0;i<strlen(result);i++)c+= result[i];
reverse(c);
cout << c;
return 0;
}
python코드는 2줄로도 가능..
A, B = map(int, input().split())
print(A+B)