언어 자료구조 알고리즘/C언어 예제

큰 정수 사이의 덧셈, C언어 소스

언제나휴일 2016. 4. 3. 18:52
반응형

큰 정수 사이의 덧셈, 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;

}

반응형