배열로 표현된 숫자는 숫자의 각 자릿수가 배열의 개별 요소에 하나씩 저장되는 형태입니다. 예를 들어 숫자 234는 배열 {2, 3, 4}와 같이 표현할 수 있습니다.
이렇게 표현된 두 숫자를 더하려면 가장 낮은 자릿수(일의 자리)부터 차례대로 더하면서, 합이 10 이상일 경우 받아올림(carry)을 다음 자릿수로 전달하는 방식을 사용합니다. 이후 배열의 다음 자릿수에 대해서도 동일한 절차를 반복하여 전체 합을 구합니다.
간단한 예를 통해 두 숫자의 덧셈 과정을 살펴보겠습니다.
a = {2, 9, 6}
b = {6, 3, 8}
출력 결과: 934
설명: 먼저 일의 자리끼리 더하면 6 + 8 = 14가 되어 받아올림이 발생합니다. 다음으로 십의 자리에서 9 + 3 + 1(받아올림) = 13이 되어 다시 받아올림이 발생합니다. 마지막으로 백의 자리에서 2 + 6 + 1(받아올림) = 9가 됩니다. 따라서 최종 합은 934입니다.
알고리즘
배열로 저장된 두 숫자의 합을 구하는 절차는 다음과 같습니다.
먼저 두 숫자 중 어느 쪽이 더 많은 자릿수를 가지고 있는지 확인합니다. 자릿수가 다르다면, 작은 숫자의 자릿수 범위까지만 두 수를 더한 뒤, 남은 큰 숫자의 자릿수들을 순서대로 처리해 나갑니다.
또한 덧셈 과정에서 발생하는 받아올림을 추적하기 위한 변수(carry)를 사용합니다. 이 변수는 초기값이 0이며, 각 자릿수 덧셈 시마다 새로 계산된 받아올림 값으로 갱신됩니다. 이렇게 자릿수별로 합을 하나씩 구해 결과 배열에 저장한 후, 최종 결과를 출력합니다.
예제 코드
#include <iostream>
using namespace std;
int Sum(int a[], int b[], int n, int m){
int sum[n];
int i = n - 1, j = m - 1, k = n - 1;
int c = 0, s = 0;
while (j >= 0) {
s = a[i] + b[j] + c;
sum[k] = (s % 10);
c = s / 10;
k--;
i--;
j--;
}
while (i >= 0) {
s = a[i] + c;
sum[k] = (s % 10);
c = s / 10;
i--;
k--;
}
for (int i = 0; i <= n-1; i++) {
cout<<sum[i];
}
}
int main(){
int a[] = { 5, 6, 9 };
int b[] = { 3, 8 };
int n = sizeof(a) / sizeof(a[0]);
int m = sizeof(b) / sizeof(b[0]);
cout<<"The sum is ";
if (n >= m)
Sum(a, b, n, m);
else
Sum(b, a, m, n);
return 0;
}
실행 결과
The sum is 607
위 코드에서는 세 자리 숫자 {5, 6, 9}와 두 자리 숫자 {3, 8}을 더하여 607이라는 결과를 얻습니다. 함수 호출 시 자릿수가 많은 배열을 첫 번째 인자로 전달함으로써, 두 배열의 길이가 달라도 올바르게 덧셈을 수행할 수 있습니다.