본문 바로가기

Algorithm/문자열 처리

Baekjoon 10353 큰 수 A+B (2)

 

Link https://www.acmicpc.net/problem/10757

소스결과 1988KB / 0 ms

출처 Baekjoon

언어 C++17

분류 큰 수, 사칙연산

 

설명

최대 10의 1만 제곱의 범위의 수 2개가 주어질 때 2개의 합을 구하는 결과를 작성하시오

 

원하는 모습으로 구현은 됬지만 코드가 보기보다 스파게티 코드가 됬다.

전가산기를 구현한다는 느낌으로했지만 생각보다 많이 꼬였다.

 

제약사항

- 10의 1만 제곱의 범위를 받을 수 있는 자료형은 문자열밖에 없다.
- 사용언어 제한

 

알고리즘

1. A와 B를 입력받고 A와 B의 길이를 구한다.

2. A와 B를 아스키 값이 아닌 정수값으로 바꾼다.

3. A와 B길이를 비교해 출력 배열의 시작 위치를 구한다.

4. A와 B의 길이를 기준으로 역순으로 계산한다.

 4 - 1. 현재 위치 값을 계산하여 10이 넘는 경우는 Carry로 계산해 따로 저장한다.

 4 - 1. 이전 Carry 값과 현재 위치값 을 다 더한후 10으로 나눈 값을 출력값으로 지정한다.

5. 마지막 Carry가 존재하는 경우 1을 출력 후, 출력 배열의 값을 출력한다.

 

소스코드

#include <iostream>
#include <cstring>

using namespace std;

const int MAX = 10000;

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

	char opnd1[MAX + 1] = {}, opnd2[MAX + 1] = {};
	int carry[MAX + 1] = {};
	char result[MAX + 2] = {};
	int op1Len, op2Len;

	cin >> opnd1 >> opnd2;

	op1Len = strlen(opnd1); op2Len = strlen(opnd2);

	for (int i = 0; opnd1[i] || opnd2[i]; i++)
	{
		if (opnd1[i])
			opnd1[i] -= '0';
		if (opnd2[i])
			opnd2[i] -= '0';
	}

	int strPos = op1Len > op2Len ? op1Len : op2Len;

	for (int i = 0; i < MAX + 1; i++)
	{
		if (op1Len <= i && op2Len <= i)
			break;
		int op1 = (op1Len - i) > 0 ? opnd1[op1Len - (i+1)] : 0;
		int op2 = (op2Len - i) > 0 ? opnd2[op2Len - (i+1)] : 0;
		carry[strPos-(i+1)] = (op1 + op2 + carry[strPos - i]) / 10;
		result[strPos - (i+1)] = ((op1 + op2 + carry[strPos - i]) % 10) + '0';
	}

	if (carry[0])
		cout << 1;

	for (int i = 0; result[i]; i++)
		cout << result[i];

	return 0;
}