백준 10757번 큰 수 A+B

Develop My Life·2022년 2월 25일
0

PS

목록 보기
9/32

문제

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

입력

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

출력

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

시도 1

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	string result = "";
	string A, B;
	cin >> A >> B;
	int up = 0;
	if (A.size() == B.size()) {
		for (int i = B.size() - 1; i >= 0; i--) {
			int a = (int)A[i] - (int)'0';
			int b = (int)B[i] - (int)'0';
			int tmp = a + b + up;
			if (tmp >= 10) {
				up = 1;
			}
			else {
				up = 0;
			}
			tmp = tmp % 10;
			result += to_string(tmp);
		}
		if (up == 1) {
			result += "1";
		}
	}
	else if (A.size() > B.size()) {
		int diff = A.size() - B.size();
		for (int i = B.size() - 1; i >= 0; i--) {
			int a = (int)A[i + diff] - (int)'0';
			int b = (int)B[i] - (int)'0';
			int tmp = a + b + up;
			if (tmp >= 10) {
				up = 1;
			}
			else {
				up = 0;
			}
			tmp = tmp % 10;
			result += to_string(tmp);
		}
		for (int i = diff - 1; i >= 0; i--) {
			int a = (int)A[i] - (int)'0';
			int tmp = a + up;
			if (tmp >= 10) {
				up = 1;
			}
			else {
				up = 0;
			}
			tmp = tmp % 10;
			result += to_string(tmp);
		}
	}
	else if (B.size() > A.size()) {
		int diff = B.size() - A.size();
		for (int i = A.size() - 1; i >= 0; i--) {
			int a = (int)B[i + diff] - (int)'0';
			int b = (int)A[i] - (int)'0';
			int tmp = a + b + up;
			if (tmp >= 10) {
				up = 1;
			}
			else {
				up = 0;
			}
			tmp = tmp % 10;
			result += to_string(tmp);
		}
		for (int i = diff - 1; i >= 0; i--) {
			int a = (int)B[i] - (int)'0';
			int tmp = a + up;
			if (tmp >= 10) {
				up = 1;
			}
			else {
				up = 0;
			}
			tmp = tmp % 10;
			result += to_string(tmp);
		}
		
	}
	


	for (int i = result.size() - 1; i >= 0; i--) {
		cout << result[i];
	}
	cout << '\n';


	return 0;
}
  • 틀렸다고 나오는데 반례를 찾을 수 없었다..

풀이

#include <iostream>
#include <algorithm> //reverse
#include <string> // to_string

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	string result = "";
	string A, B;
	cin >> A >> B;
	reverse(A.begin(), A.end());
	reverse(B.begin(), B.end());

	int len;
	if (A.length() > B.length()) {
		int diff = A.length() - B.length();
		for (int i = 0; i < diff; i++) {
			B += '0';
		}
	}
	else if (B.length() > A.length()) {
		int diff = B.length() - A.length();
		for (int i = 0; i < diff; i++) {
			A += '0';
		}
	}

	int up = 0;
	for (int i = 0; i < A.length(); i++) {
		int a = (int)A[i] - (int)'0';
		int b = (int)B[i] - (int)'0';
		int tmp = a + b + up;
		if (tmp >= 10) {
			up = 1;
		}
		else {
			up = 0;
		}
		tmp = tmp % 10;
		result += to_string(tmp);
	}
	if (up == 1) {
		result += "1";
	}

	reverse(result.begin(), result.end());
	for (int i = 0; i < result.length(); i++) {
		cout << result[i];
	}
	cout << '\n';
	

	return 0;
}
  • 이전의 방법과 다르게 새로 구현했다.
  1. 입력받은 문자열을 모두 뒤집는다.
  2. 자리수를 맞추기 위해서 차이가 나는 만큼 자릿수가 작은 것 뒤에 0을 붙여준다.
  3. 자리수가 모두 맞음으로 앞에서 부터 차례로 더해서 result에 값을 저장하며 이 때 up이라는 변수에 10보다 클 경우 1을 넣어 자리 올림을 처리한다.
  4. result를 뒤집는다.
  5. result를 출력한다.

0개의 댓글