문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)
출력
첫째 줄에 A+B를 출력한다.
예제 입력 1
9223372036854775807 9223372036854775808
예제 출력 1
18446744073709551615
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string a, b;
cin >> a >> b;
string result;
int lenA, lenB;
lenA = a.length();
lenB = b.length();
int longer, shorter;
longer = lenA >= lenB ? lenA : lenB;
shorter = lenA >= lenB ? lenB : lenA;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if(longer == lenA) {
while(b.length() < longer) {
b += '0';
}
}
else if(longer == lenB) {
while(a.length() < longer) {
a += '0';
}
}
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int carry = 0;
while(!a.empty() && !b.empty()) {
int a_back = a.back() - '0';
int b_back = b.back() - '0';
int remain = (a_back + b_back + carry) % 10;
carry = (a_back + b_back + carry) / 10;
result = (char)(remain + '0') + result;
a.pop_back();
b.pop_back();
}
if(carry > 0) {
result = (char)(carry + '0') + result;
}
cout << result << '\n';
return 0;
}
풀다보니 은근 코드가 길어진 문제이다.
더 압축할 수 있을것 같긴한데...
일단 두 수를 문자열로 입력받았다.
그리고 더 긴 문자열과 짧은 문자열을 판단하기 위해 longer와 shorter 변수를 선언하여 각각 length()로 판단하였다.
그리고 나서 문자열끼리 계산을 하기위해 자릿수를 맞춰주어야 했는데,
더 짧은 입력값의 앞에 긴 입력값의 길이와 같아지도록 0으로 채워주었다.
문자열의 앞에 0을 넣기위해 reverse를 해서 뒤에 넣어준다음 다시 reverse를 해주었다.
그리고 올림값을 나타내는 carry 변수를 선언하고, 문자열의 끝부터 계산하도록 하였다.
처음 계산할때는 carry값이 없기때문에 0으로 초기화 해주었다.
remain 변수는 올림값을 제외한 계산값이다.
예를들어 6+7이라고 하면 결과는 13인데 여기서 올림값은 1이되는것이고 remain은 3이되는것이다.
그렇게 계산하면서 result의 앞에 계속 붙여주고, 계산에 들어간 값들은 문자열에서 pop해주었다.
이 반복을 a와 b가 더이상 pop할것이 없어질때까지, 즉 빈값이 될때까지 진행하는데,
모든 반복문이 끝나고도 carry값이 남아있을경우 마지막에 결과값의 앞에 붙여주고 출력해주면 된다.
'PS > 백준' 카테고리의 다른 글
백준 / 수학 / 2581번 / 소수 / C++ (0) | 2022.01.13 |
---|---|
백준 / 수학 / 1011번 / Fly me to the Alpha Centuari / C+ (0) | 2022.01.12 |
백준 / 수학 / 2839번 / 설탕 배달 / C++ (0) | 2022.01.10 |
백준 / 수학 / 2775번 / 부녀회장이 될테야 / C++ (0) | 2022.01.09 |