【模板】高精度 加减乘 重载法

建议看目录。

重载法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN = 100000 + 10;
struct Big{
    int a[MAXN];
    int len;
    void print()
    {
        bool h = 1;
        int t = this->len;
        while(!this->a[t])
            t --;
        for(int i = t; i >= 1; i --)
        {
            printf("%d", this->a[i]);
            h = 0;
        }
        if(h) printf("0");
    }
};

Big operator + (Big A, Big B)
{
    A.len = max(A.len, B.len)+1;
    for(int i = 1; i <= A.len; i ++)
    {
        A.a[i] += B.a[i];
        A.a[i+1] += A.a[i]/10;
        A.a[i] %= 10;
    }
    return A;
}

bool cmp(Big A, Big B)
{
    if(A.len < B.len)
        return 0;
    if(A.len > B.len)
        return 1;
    for(int i = 1; i <= A.len; i ++)
        if(A.a[i] < B.a[i])
            return 0;
    return 1;
}

Big t;
Big operator - (Big A, Big B)
{
    if(!cmp(A,B))
    {
        t = A;
        A = B;
        B = t;
        putchar('-');
    }
    for(int i = 1; i <= A.len; i ++)
    {
        A.a[i] -= B.a[i];
        if(A.a[i] < 0)
        {
            A.a[i] += 10;
            A.a[i+1]--;
        }
    }
    return A;
}

Big operator * (Big A, Big B)
{
    Big C;
    C.len = A.len + B.len;
    for(int i = 1; i <= A.len; i ++)
        for(int j = 1; j <= B.len; j ++)
        {
            C.a[i+j-1] += A.a[i]*B.a[j];
            C.a[i+j] += C.a[i+j-1]/10;
            C.a[i+j-1] %= 10;
        }
    return C;
}

char s[MAXN];
void read(Big &A)
{
    scanf("%s", s);
    A.len = strlen(s);
    for(int i = 0; i < A.len; i ++)
        A.a[A.len-i] = s[i] - '0';
}

Big A, B, C;
int main()
{
    read(A);read(B);
    C = A + B;
//  C = A - B;
//  C = A * B;
    C.print();
    return 0;
}

重载法滋辞啊~~~


普通函数法:
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;

const int MAXN = 50000;
char ac[MAXN], bc[MAXN];
int a[MAXN], b[MAXN], c[MAXN];
int al, bl, cl;

void jia()
{
    for(int i = 0; i < cl; i ++)
    {
        c[i] += (a[i] + b[i]);
        if(c[i] >= 10)
        {
            c[i] %= 10;
            c[i+1] ++;
        }
    }
    while(!c[cl])
        cl --;
    for(int i = cl; i >= 0; i --)
        cout << c[i];
    cout << endl;
}

void jian()
{
    for(int i = 0; i < cl; i ++)
    {
        c[i] += (a[i] - b[i]);
        if(c[i] < 0)
        {
            c[i] += 10;
            c[i+1] --;
        }
    }
    while(!c[cl])
        cl --;
    for(int i = cl; i >= 0; i --)
        cout << c[i];
    cout << endl;
}

void cheng()
{
    for(int i = 0; i < al; i ++)
    {
        for(int j = 0; j <= bl; j ++)
        {
            c[i+j] += a[i] * b[j];
            if(c[i+j] >= 10)
            {
                c[i+j+1] += (c[i+j]/10);
                c[i+j] %= 10;
            }
        }
    }
    while(!c[cl])
        cl --;
    for(int i = cl; i >= 0; i --)
        cout << c[i];
    cout << endl;
}

int main()
{
    scanf("%s %s",ac,bc);
    al = strlen(ac);
    bl = strlen(bc);
    cl = al+bl;
    for(int i = al-1; i >= 0; i --)
        a[al-i-1] = (int)(ac[i] - '0');
    for(int i = bl-1; i >= 0; i --)
        b[bl-i-1] = (int)(bc[i] - '0');
//  jia();
//  jian();
    cheng();
    return 0;
}
分开的话:
加法:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;

const int MAXN = 100010;
char ac[MAXN], bc[MAXN];
int a[MAXN], b[MAXN], c[MAXN];

int main()
{
    scanf("%s %s", ac, bc);
    int al = strlen(ac), bl = strlen(bc), cl = max(al,bl);
    for(int i = 0; i < al; i ++)
        a[al-i-1] = (int)(ac[i] - '0');
    for(int i = 0; i < bl; i ++)
        b[bl-i-1] = (int)(bc[i] - '0');
    for(int i = 0; i < cl; i ++)
    {
        c[i] += (a[i] + b[i]);
        if(c[i] >= 10)
        {
            c[i+1] ++;
            c[i] %= 10;
        }
    }
    while(!c[cl])
        cl --;
    for(int i = cl; i >= 0; i --)
        printf("%d",c[i]);
    puts("");
    return 0;
}

减法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN = 100010;
char ac[MAXN], bc[MAXN], t[MAXN];
int a[MAXN], b[MAXN], c[MAXN];

int main()
{
    scanf("%s %s", ac, bc);
    int al = strlen(ac), bl = strlen(bc), cl = max(al,bl);
    if((al < bl) || ((al == bl) && strcmp(ac,bc) < 0))
    {
        cout << "-";
        strcpy(t,ac);
        strcpy(ac,bc);
        strcpy(bc,t);
        swap(al,bl);
    }
    for(int i = 0; i < al; i ++)
        a[al-i-1] = (int)(ac[i] - '0');
    for(int i = 0; i < bl; i ++)
        b[bl-i-1] = (int)(bc[i] - '0');
    for(int i = 0; i < cl; i ++)
    {
        c[i] += (a[i] - b[i]);
        if(c[i] < 0)
        {
            c[i+1] --;
            c[i] += 10;
        }
    }
    while(!c[cl])
        cl --;
    for(int i = cl; i >= 0; i --)
        printf("%d", c[i]);
    puts("");
    return 0;
}

乘法:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;

const int MAXN = 100010;
char ac[MAXN], bc[MAXN];
int a[MAXN], b[MAXN], c[MAXN << 1];

int main()
{
    scanf("%s %s", ac, bc);
    int al = strlen(ac), bl = strlen(bc), cl = al + bl;
    for(int i = 0; i < al; i ++)
        a[al-i-1] = (int)(ac[i] - '0');
    for(int i = 0; i < bl; i ++)
        b[bl-i-1] = (int)(bc[i] - '0');
    for(int i = 0; i < al; i ++)
    {
        for(int j = 0; j < bl; j ++)
        {
            c[i+j] += (a[i] * b[j]);
            if(c[i+j] >= 10)
            {
                c[i+j+1] += (c[i+j]/10);
                c[i+j] %= 10;
            }
        }
    }
    while(!c[cl])
        cl --;
    for(int i = cl; i >= 0; i --)
        printf("%d", c[i]);
    puts("");
    return 0;
}

托某次考试的福,写了实数。

实数相加
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 1000;
char s[MAXN];
int p1[MAXN], p2[MAXN], Q1[MAXN], Q2[MAXN];


int main()
{
    scanf("%s", s+1);
    int len = strlen(s+1);
    int x;
    for(int i = 1; i <= len; i ++)
        if(s[i] == '.')
            x = i;
    int zhshlen1 = x-1;
    for(int i = 1; i < x; i ++)
        p1[zhshlen1-i+1] = s[i]-'0';
    int xshlen1 = len-x;
    for(int i = x+1; i <= len; i ++)
        Q1[i-x] = s[i]-'0';


    scanf("%s", s+1);
    len = strlen(s+1);
    for(int i = 1; i <= len; i ++)
        if(s[i] == '.')
            x = i;
    int zhshlen2 = x-1;
    for(int i = 1; i < x; i ++)
        p2[zhshlen2-i+1] = s[i]-'0';
    int xshlen2 = len-x;
    for(int i = x+1; i <= len; i ++)
        Q2[i-x] = s[i]-'0';

    /*
    for(int i = zhshlen1; i >= 1; i --)
        cout << p1[i];
    cout << '.';
    for(int i = 1; i <= xshlen1; i ++)
        cout << Q1[i]; 
    cout << endl;*/


    int xsh = max(xshlen1, xshlen2);
    int zh = max(zhshlen1, zhshlen2);
    for(int i = xsh; i >= 1; i --)
    {
        Q1[i] += Q2[i];
        Q1[i-1] += Q1[i]/10;
        Q1[i] %= 10;
    }
    if(Q1[0] != 0)
    {
        Q1[0] = 0;
        p1[1] ++;
    }

    for(int i = 1; i <= zh; i ++)
    {
        p1[i] += p2[i];
        p1[i+1] += p1[i]/10;
        p1[i] %= 10;
    }


    int t = zh+1;
    while(!p1[t])
        t --;
    bool h = 1;
    for(int i = t; i >= 1; i --)
    {
        h = 0;
        cout << p1[i];
    }
    if(h) cout << '0';
    h = 1;
    for(int i = 1; i <= xsh; i ++)
        if(Q1[i])
            h = 0;
    if(h) return 0;
    t = xsh;
    while(!Q1[t])
        t --;
    cout << '.';
    for(int i = 1; i <= t; i ++)
        cout << Q1[i];
    cout << endl;
    return 0;
}

/*
0.001
0.009


0.1
9.9
10

999.999
999.99
1999.989

0.0
0.0
0

99.1
10.9
110

12345.6789
12345.6789

1234.2444
1234.421

3586861.44535489651
128651208653.534128651
128654795514.97948354751

5320.41046
21203.0
26523.41046


88979.98975
789.89
89769.87975


12.1
1.23

12.0
19.0
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值