https://www.acmicpc.net/problem/15353
<코드>
#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
deque<int>v1;
deque<int>v2;
vector<int>ans;
vector<int>::iterator it;
for(int i=0;i<a.size();i++)
{
v1.push_back(a[i]-'0');
}
for(int i=0;i<b.size();i++)
{
v2.push_back(b[i]-'0');
}
int len = v1.size()>v2.size()?v1.size():v2.size();
if(v1.size()>v2.size())
{
for(int i=0;i<v1.size()-v2.size();i++)
{
v2.push_front(0);
}
}
else if(v1.size()<v2.size())
{
for(int i=0;i<v2.size()-v1.size();i++)
{
v1.push_front(0);
}
}
reverse(v2.begin(),v2.end());
reverse(v1.begin(),v1.end());
int carry = 0;
for(int i=0;i<len;i++)
{
if(v1[i]+v2[i]+carry>=10)
{
ans.push_back((v1[i]+v2[i]+carry)%10);
carry = 1;
}
else{
ans.push_back(v1[i]+v2[i]+carry);
carry = 0;
}
}
if(carry) ans.push_back(carry);
reverse(ans.begin(),ans.end());
for(auto it=ans.begin();it!=ans.end();it++)
{
cout<<(*it);
}
}
<풀이 과정>
큰 수 덧셈인데 정수형 int나 long long으로는 큰 수를 표현하기엔 한계가 있다(왜냐하면 A,B의 자리수가 10^10000이기 때문이다)
그래서 생각한 방법은 큰 수 두 개를 문자열로 선언하는 것이다.
선언한 후 a,b의 자릿수에 따라서 ex) 1234 1 이면 1234 0001 를 만들어주고, 1 1234이면, 0001 1234를 만들어준다.
자리수를 같게 해줘야 연산이 가능하기 때문이다.
나는 deque를 사용해서 풀었는데, deque를 사용하면 앞,뒤로 원소를 추가할 수 있기 때문이다(이 경우에선 앞에 원소를 추가하기 위함)
그리고 연산은 마지막 원소부터 해야하기 때문에, reverse함수를 이용해 자리를 바꿔주었다.
'PS > 문자열 알고리즘[String]' 카테고리의 다른 글
백준 1213 팰린드롬 만들기(c++) (0) | 2022.07.27 |
---|---|
백준 16916 부분 문자열(c++) (0) | 2022.07.13 |
백준 11478 서로 다른 부분 문자열의 개수(c++) (1) | 2022.07.11 |
백준 1120 문자열(c++) (0) | 2022.07.08 |
백준 1431 시리얼 번호(c++) (1) | 2022.07.08 |