큰 두 수의 합을 구한다.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string n1,n2,res,ans; // 수가 크기 때문에, 문자열로 입력받음
cin >> n1 >> n2;
int car=0; // 올림수
int onesize=n1.size(); // 첫번째 수의 자릿수
int twosize=n2.size(); // 두번째 수의 자릿수
while(onesize>0||twosize>0)
{
int nn1=0; // 첫번째 수의 자릿수 중 하나(일의 자리부터 시작)
if(onesize>0)
{
nn1=n1[--onesize]-'0'; // 문자 0 을 빼주면 함수를 쓰지 않고도 문자를 숫자로 바꾸기 가능
}
int nn2=0;
if(twosize>0)
{
nn2=n2[--twosize]-'0';
}
int cur=nn1+nn2+car;
car=cur/10; // 올림수 변경
cur%=10;
char ccar=cur+'0'; // 문자로 변환
res+=ccar;
}
if(car>0) // 올림수가 마지막까지 남아있다면
{
res+=car+'0';
}
for(int i=res.length()-1;i>=0;i--) // 출력
{
cout << res[i];
}
}
코드는 https://velog.io/@gkscodus11 에서 참조했다.
더하는 수가 크기 때문에, 아무리 큰 정수형을 쓰더라도 범위가 초과해 버린다. 그래서 숫자를 문자열로 받은 다음에, 문자열의 문자 하나하나를 정수로 바꾸고, 더해 결과를 출력해야 한다.
입력받은 문자열의 마지막 요소를 추출하고 올림수와 계속하여 더해가는 식으로 문자열을 만들어나가고, 만들어진 문자열을 출력하면 된다.
'0'을 더하면 숫자를 문자로 만들 수 있고, 빼면 문자를 숫자로 바꿀 수 있다. 그 이유는
아스키코드표에서 문자 0~9의 값을 48~57로 지정해 놓았기 때문이다. (예시: 문자가 '3'일 경우 아스키 코드 상 51이므로 여기에 '0'(=48)을 빼주면 숫자 3를 얻을 수 있다.)