큰 정수 사이의 덧셈, 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;
}
'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글
원형 연결리스트로 러시안룰렛, C언어 소스 (0) | 2016.04.03 |
---|---|
3X3 퍼즐 게임, C언어 소스 (0) | 2016.04.03 |
앞 뒤가 똑같은 문장 회문(Palindrome), C언어 소스 (0) | 2016.04.03 |
반복문으로 차량 번호 알아맞추기, C언어 소스 (0) | 2016.04.03 |
100분의 1초 단위로 현재 시각을 출력, C언어 소스 (0) | 2016.04.03 |
C언어에서의 캡슐화, C언어 소스 (0) | 2016.04.03 |
암스트롱의 수, C언어 소스 (2) | 2016.04.03 |
피타고라스의 정리에 만족하는 수 구하기, C언어 소스 (0) | 2016.04.03 |
랜덤 값 맞추기, C언어 소스 (0) | 2016.04.03 |
문자열에서 문자 제거, C언어 소스 (0) | 2016.04.03 |