Moong

[백준 10757번][C++] 백준 큰 수 A+B 본문

Baekjoon

[백준 10757번][C++] 백준 큰 수 A+B

방울토망토 2021. 1. 14. 04:14

www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)

출력

첫째 줄에 A+B를 출력한다.


풀이

Algorithm

  1. C++에서 최대로 범위가 큰 정수type은 unsigned long long인데, 그조차 범위가 0 ~ 4,294,967,295밖에 되지 않아요. 문제에서 요구하는 범위보다 한참 모자라죠!
    • 그렇다면 A, B를 문자열로 받아야겠죠?!
  2. while문을 끝까지 돌게 하기 위해 두 수의 길이를 통일시켜줘요
    • 방법은 예를 들면 12345, 1로 입력받았을 경우 뒤의 수를 00001로 만들어주면 되겠죠?
    • 이처럼 temp2 변수를 이용하여 작은 수의 앞부분에 A.length()-B.length()만큼 0으로 채워줘요
  3. 이제 두 문자열의 문자를 뒤에서부터 하나씩 읽어와서 더해주고, 그 결과를 차례로 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문을 도는 동안 문자열에 있는 문자를 뒤에서부터 차례로 모두 읽어오게 해요
  4. while문을 빠져나온 후 최고자릿수의 덧셈에 올림수가 발생했는지 확인해줘요
    • 만일 있었으면 result 앞에 1을 붙여줘야겠죠?
    • 예를 들면 99+1의 경우 while문을 빠져나왔을 때 result는 00이고, flag는 1일거예요. 최고 자릿수의 올림수는 while문을 빠져나와서 다시 또 처리해주어야 해요. result 앞에 1을 더해줘서 '1'+"00" = "100"을 해줘요!
  5. 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;
}
Comments