高精度,输出与样例完全符合,但全WA
查看原帖
高精度,输出与样例完全符合,但全WA
117846
Cyoutous楼主2024/10/10 22:08

有人能帮忙看看吗

#include <stdio.h>
#include <math.h>
#include <string.h>

struct info
{
    int num[10005], len;
    char oper;

    info(void);
    void correct(void);
};

info::info()
{
    memset (num, 0, sizeof(num));
    len = 1;
    oper = '+';
}

void info::correct(void)
{
    int t = len;
    while (num[t] == 0 && t >= 1)
        t--;
    len = t;
    return;
}

bool operator > (info A, info B)
{
    if (A.oper == '+' && B.oper == '-') return true;
    if (A.oper == '-' && B.oper == '+') return false;

    if (A.oper == '+' && B.oper == '+')
    {
        if (A.len > B.len) return true;
        if (A.len < B.len) return false;

        for (int i = A.len; i >= 1; i--)
        {
            if (A.num[i] > B.num[i]) return true;
            if (A.num[i] < B.num[i]) return false;
        }
    }
    if (A.oper == '-' && B.oper == '-')
    {
        if (A.len > B.len) return false;
        if (A.len < B.len) return true;

        for (int i = A.len; i >= 1; i--)
        {
            if (A.num[i] > B.num[i]) return false;
            if (A.num[i] < B.num[i]) return true;
        }
    }

    return false;
}

info operator + (info A, info B)
{
    info re;
    re.len = A.len > B.len ? A.len : B.len;
    for (int i = 1; i <= re.len; i++)
    {
        re.num[i] += A.num[i] + B.num[i];
        if (re.num[i] >= 10)
        {
            re.num[i + 1] += re.num[i] / 10;
            re.num[i] %= 10;
            re.len = (i + 1 > re.len) ? (i + 1) : re.len;
        }
    }

    return re; 
}

info operator - (info A, info B)
{
    info re;
    if (B > A)
    {
         info tmp = A;
         A = B;
         B = tmp;
         re.oper = '-';
    }
    
    re.len = A.len;
    for (int i = 1; i <= A.len; i++)
    {
        re.num[i] += (A.num[i] - B.num[i]);
        if (re.num[i] < 0)
        {
            re.num[i] += 10;
            re.num[i + 1] -= 1;
        }
    }

    re.correct();
    return re;
}

info operator * (info A, info B)
{
    info re;
    re.len = A.len + B.len + 1;
    for (int i = 1; i <= A.len; i++)
        for (int j = 1; j <= B.len; j++)
            re.num[i + j - 1] += A.num[i] * B.num[j];

    for (int i = 1; i <= re.len; i++)
        if (re.num[i] >= 10)
        {
            re.num[i + 1] += re.num[i] / 10;
            re.num[i] %= 10;
            re.len = (i + 1 > re.len) ? (i + 1) : re.len;
        }

    re.correct();
    return re; 
}

info operator / (info A, info B)
{
    info re;
    if (B > A) return re;

    re.len = A.len - B.len + 1;
    for (int i = A.len; i >= B.len; i--)
    {
        info tmp;
        tmp.len = i;
        for (int j = B.len, k = i; j >= 1; j--, k--)
            tmp.num[k] = B.num[j];
        
        while (!(tmp > A))
        {
            A = A - tmp;
            re.num[i - B.len + 1]++;
        }
    }

    re.correct();
    return re;
}

info operator % (info A, info B)
{
    if (B > A) return A;

    for (int i = A.len; i >= B.len; i--)
    {
        info tmp;
        tmp.len = i;
        for (int j = B.len, k = i; j >= 1; j--, k--)
            tmp.num[k] = B.num[j];
        
        while (!(tmp > A))
            A = A - tmp;
    }

    return A;
}

info getInfo()
{
    info tmp, tar;
    char c;
    int i = 1, j;
    while (true)
    {
        c = getchar();
        if (c == '\n')
            break;
        if (c == ' ')
            continue;

        tmp.num[i] = c - '0';
        tmp.len = (tmp.len < i) ? i : tmp.len;
        i++;
    }

    tar.len = tmp.len;
    j = 1;
    for (i = tmp.len; i >= 1; i--, j++)
        tar.num[j] = tmp.num[i];

    return tar;
}

void printInfo(info tar)
{
    if (tar.oper == '-')
        printf ("-");

    bool flag = 0;
    for (int i = tar.len; i >= 1; i--)
        if (flag == 1 || tar.num[i] != 0)
        {
            printf ("%d", tar.num[i]);
            flag = 1;
        }
    
    if (flag == 0)
        printf ("0");
}

int main()
{
    info a = getInfo(), b = getInfo();

    printInfo (a + b);
    printf ("\n");
    printInfo (a - b);
    printf ("\n");
    printInfo (a * b);
    printf ("\n");
    printInfo (a / b);
    printf ("\n");
    printInfo (a % b);
    printf ("\n");

    return 0;
}
2024/10/10 22:08
加载中...