본문 바로가기
Algorithms

큰 수의 덧셈

by OKOK 2021. 7. 12.
#include <stdio.h>

int mstrcmp(const char* a, const char* b) {
    int i;
    for (i = 0; a[i] != 0; ++i) {
        if (a[i] != b[i]) return a[i] - b[i];
    }
    return a[i] - b[i];
}

void mstrcpy(const char* src, char* dst) {
    int c = 0;
    while (src[c]) {
        dst[c] = src[c];
        c++;
    }
    dst[c] = 0;
}

#define MAX_LENGTH 10000

extern void init(int);
extern void add(char[], char[], char[]);
extern void sub(char[], char[], char[]);

#define CMD_INIT 100
#define CMD_ADD  200
#define CMD_SUB  300

int main() {
    int tc;
    freopen("input.txt", "r", stdin);
    scanf("%d", &tc);
    for (register int t = 1; t <= tc; ++t) {
        int cmd, n;
        scanf("%d %d", &cmd, &n); // first line must be CMD_INIT
        init(n);
        bool result = true;
        while (n--) {
            char a[MAX_LENGTH + 1];
            char b[MAX_LENGTH + 1];
            char r[MAX_LENGTH + 2];
            char ans[MAX_LENGTH + 2];
            scanf("%d %s %s %s", &cmd, a, b, ans);
            if (!result) continue;
            if (cmd == CMD_ADD) add(a, b, r);
            else if (cmd == CMD_SUB) sub(a, b, r);
            result &= mstrcmp(r, ans) == 0;
        }
        printf("#%d %d\n", t, result ? 100 : 0);
    }
    return 0;
}

#define MAX_LENGTH 10000

int arr[10001];

void init(int n) {

}

void add(char a[], char b[], char c[]) {
    register int i, len = 0, len2 = 0, max;

    for (i = 0; a[i]; i++)
        len++;
    for (i = 0; b[i]; i++)
        len2++;
    for (i = len - 1; i >= 0; i--)
        arr[len - 1 - i] += a[i] - 48;
    for (i = len2 - 1; i >= 0; i--)
        arr[len2 - 1 - i] += b[i] - 48;
    if (len > len2)
        max = len;
    else
        max = len2;
    for (i = 0; i < max; i++)
        if (arr[i] > 9)
        {
            arr[i + 1]++;
            arr[i] %= 10;
        }
    if (arr[max] > 0)
        max++;
    for (i = 0; i < max; i++)
    {
        c[i] = arr[max - 1 - i] + 48;
        arr[max - 1 - i] = 0;
    }
    c[i] = '\0';
}

void sub(char a[], char b[], char c[]) {

    register int i, len = 0, len2 = 0, max = 0;

    for (i = 0; a[i]; i++)
        len++;
    for (i = 0; b[i]; i++)
        len2++;
    if (len > len2)
        max = 1;
    else if (len < len2)
        max = 2;
    else
    {
        for (i = 0; i < len; i++)
        {
            if (a[i] == b[i])
                continue;
            if (a[i] > b[i])
            {
                max = 1;
                break;
            }
            else
            {
                max = 2;
                break;
            }
        }
        if (!max)
            max = 1;
    }
    if (max == 1)
    {
        for (i = len - 1; i >= 0; i--)
            arr[len - 1 - i] += a[i] - 48;
        for (i = len2 - 1; i >= 0; i--)
            arr[len2 - 1 - i] -= b[i] - 48;
        for (i = 0; i < len; i++)
            if (arr[i] < 0)
            {
                arr[i] += 10;
                arr[i + 1]--;
            }
        for (i = len - 1; i >= 0; i--)
            if (arr[i] > 0)
            {
                len = i + 1;
                break;
            }
        for (i = 0; i < len; i++)
        {
            c[i] = arr[len - 1 - i] + 48;
            arr[len - 1 - i] = 0;
        }
        c[i] = '\0';
    }
    else
    {
        for (i = len2 - 1; i >= 0; i--)
            arr[len2 - 1 - i] += b[i] - 48;
        for (i = len - 1; i >= 0; i--)
            arr[len - 1 - i] -= a[i] - 48;
        for (i = 0; i < len2; i++)
            if (arr[i] < 0)
            {
                arr[i] += 10;
                arr[i + 1]--;
            }
        for (i = len2 - 1; i >= 0; i--)
            if (arr[i] > 0)
            {
                len2 = i + 1;
                break;
            }
        c[0] = '-';
        for (i = 0; i < len2; i++)
        {
            c[i + 1] = arr[len2 - 1 - i] + 48;
            arr[len2 - 1 - i] = 0;
        }
        c[i + 1] = '\0';
    }
}

1
100 4
300 38249671 218 38249453
300 589067 7 589060
300 7170118517632053031785984933881934987 7618290910216 7170118517632053031785977315591024771
200 49776221 63601245121662476078654072042022279345548728 63601245121662476078654072042022279395324949

댓글