큰 정수 사이의 덧셈, C언어 소스
큰 정수 사이의 덧셈, C언어 소스
질문) 0~10^100 이내의
두 수 사이의 덧셈을 하려면 어떻게 해야 하나요? int
형식으로 표현할 수 있는 범위가 넘는데 어떻게 해야 할 지 난감하네요.
예)
12345678901234567890
20
12345678901234567910
답변)
정수를 입력받는다고 하였는데 C언어의 정수 형식의 표현 범위를 벗어나기 때문에 정수 형식의 변수로 입력받는 것이 아닙니다. 먼저 큰 수를 입력받기 위해 char 배열을 사용합니다.
그리고 입력받은 큰 수 두 개의 자리를 맞추기 쉽게 sprintf로 앞자리는 0으로 채웁니다.
printf("첫 번째 수:");
scanf_s("%s", buf1, sizeof(buf1));
sprintf_s(numstr1, sizeof(numstr1), "%0100s", buf1);
printf("두 번째 수:");
scanf_s("%s", buf2, sizeof(buf2));
sprintf_s(numstr2, sizeof(numstr2), "%0100s", buf2);
끝자리부터 두 수를 더하여 결과 배열에 대입합니다. 이 때 carry가 발생하는지 확인해야 합니다.
그리고 10^100 승 이내의 두 수를 더하면 10^100이 넘고 10^101보다 작은 수가 발생할 수 있으므로 결과를 보관할 배열은 크기를 102로 합니다.(널문자와 캐리를 위해)
for (i = 99; i >= 0; i--)
{
sum = (numstr1[i] - '0') + (numstr2[i] - '0') + carry;
carry = sum / 10;
sum = sum % 10;
result[i + 1] = sum + '0';
}
마지막 캐리를 결과
배열의 인덱스 0에
설정합니다.
result[0] =
carry + '0';
출력하기 전에 처음으로 '0'이
아닌 위치를 찾습니다.
for (i = 0; result[i] == '0'; i++);
그리고 '0'이 아닌
문자를 발견한 위치의
문자열을 출력합니다.
전체 코드는 다음과
같습니다.
//큰 수 사이의 덧셈
#include<stdio.h>
#include <string.h>
int main(void)
{
char buf1[101];
char buf2[101];
char numstr1[101];
char numstr2[101];
char result[102] = "";
int i;
int sum, carry = 0;
printf("첫 번째 수:");
scanf_s("%s", buf1, sizeof(buf1));
sprintf_s(numstr1, sizeof(numstr1), "%0100s", buf1);
printf("두 번째 수:");
scanf_s("%s", buf2, sizeof(buf2));
sprintf_s(numstr2, sizeof(numstr2), "%0100s", buf2);
for (i = 99; i >= 0; i--)
{
sum = (numstr1[i] - '0') + (numstr2[i] - '0') + carry;
carry = sum / 10;
sum = sum % 10;
result[i + 1] = sum + '0';
}
result[0] = carry + '0';
for (i = 0; result[i] == '0'; i++);
printf("%s\n",buf1);
printf("+\n");
printf("%s \n", buf2);
printf("= \n");
printf("%s\n",result + i);
printf("\n");
return 0;
}