본문 바로가기
알고리즘/구현

백준 10757번 : 큰 수 A+B

by Jason95 2021. 1. 4.

문제 링크 : www.acmicpc.net/problem/10757

내 풀이(2021.1.4.) :

#include <iostream>
#include <string>

using namespace std;

int a[1251]; // A
int b[1251]; // B
string c[1251]; // 결과

// 1~8글자짜리 int를 8글자짜리 string으로 변환 
string num2str(int num) {
	string str = to_string(num);
	string result = "00000000";
	for (int i = 0; i < str.size(); i++) {
		result[8 - str.size() + i] = str[i];
	}
	return result;
}

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

	// A, B 초기화
	string A, B; cin >> A >> B;
	for (int i = 1250; i >= 0; i--) {
		int index = A.size() - 8 * (1251 - i);
		if (index >= 0) {
			a[i] = stoi(A.substr(index, 8));
		}
		else if (index > -8) {
			a[i] = stoi(A.substr(0, 8 + index));
		}

		index = B.size() - 8 * (1251 - i);
		if (index >= 0) {
			b[i] = stoi(B.substr(index, 8));
		}
		else if (index > -8) {
			b[i] = stoi(B.substr(0, 8 + index));
		}
	}

	// C 초기화
	for (int i = 0; i < 1251; i++) {
		c[i] = "00000000";
	}

	/*
	for (int i = 0; i < 1251; i++) {
		cout << a[i];
	}
	for (int i = 0; i < 1251; i++) {
		cout << b[i];
	}
	*/

	// C = A + B
	for (int i = 1250, up = 0; i >= 0; i--) {
		int temp_a = a[i];
		int temp_b = b[i];
		int temp = temp_a + temp_b + up;
		if (temp < 100000000) up = 0;
		else up = 1;
		c[i] = num2str(temp%100000000);
	}

	// 처음으로 0이 아닌 string의 인덱스 찾기
	int index = -1;
	for (int i = 0; i < 1251; i++) {
		for (int j = 0; j < 8; j++) {
			if (c[i][j] != '0') {
				index = i;
				break;
			}
		}
		if (index != -1) break;
	}

	cout << stoi(c[index]); // 처음으로 0이 아닌 string 출력
	
	// 나머지 출력
	for (int i = index + 1; i < 1251; i++) {
		cout << c[i];
	}

	return 0;
}

큰 수를 8글자 단위로 쪼개 계산하였다.

string 타입과 int 타입으로 변환하면서

숫자 0의 처리에 유의하였다.

 

파이썬은 큰 수 연산 라이브러리가 제공되지만

C++은 제공되지 않아 직접 연산 알고리즘을 구현해야 했다.