高精度 加减乘

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;

const int MAXN = 2007;

struct BigNum
{///数值保存从0位开始

    int num[MAXN];///数值,逆序保存
    int op;///表示符号位,1表示正数,-1表示负数
    int size;///数的位数

    BigNum(){
        size=1, op=1;
        memset(num, false, sizeof(num));
    }
    void Cin()
    {
        char s[MAXN];

        scanf("%s", s);
        size = strlen(s);

        for(int i=0, k=size-1; i<size; i++)
        {
            if(s[i]=='-')
            {
                k--;
                op = -1;
            }
            else
                num[k--] = s[i] - '0';
        }

        if(op == -1)
            size--;
    }
    bool operator <= (const BigNum &b)const
    {///去符号比较大小
        if(size > b.size)return false;
        if(size < b.size)return true;

        for(int i=size-1; i>=0; i--)
        {
            if(num[i] > b.num[i])return false;
            if(num[i] < b.num[i])return true;
        }

        return true;
    }
    void operator = (const BigNum &b)
    {
        size = b.size, op=b.op;

        for(int i=0; i<b.size; i++)
            num[i] = b.num[i];
    }
    void operator = (const int &b)
    {
        int x = b;

        if(x < 0)
        {
            op = -1;
            x = -x;
        }

        size = 0;
        do
        {
            num[size++] = x % 10;
            x /= 10;
        }
        while(x);
    }
    BigNum operator * (const BigNum &b)const
    {
        BigNum res;

        res.op = b.op * op;
        res.size = size + b.size - 1;

        for(int i=0; i<b.size; i++)
        for(int j=0; j<size; j++)
        {
            res.num[i+j] += num[j] * b.num[i];
        }

        res.CarryBit();

        return res;
    }
    BigNum operator * (const int &b)const
    {
        int x = b;
        BigNum res;

        res.size = size;
        if(x < 0)
        {
            res.op = res.op * -1;
            x = -x;

        }

        for(int i=0; i<size; i++)
        {
            res.num[i] = num[i] * x;
        }

        res.CarryBit();

        return res;
    }
    friend BigNum operator + (BigNum a, BigNum b)
    {
        BigNum res;

        if(a.op != b.op)
        {
            res = a - b;
            b.op = b.op * -1;
        }
        else
        {
            res.op = a.op;
            res.size = max(a.size, b.size);

            for(int i=0; i<res.size; i++)
                res.num[i] = a.num[i] + b.num[i];
            res.CarryBit();
        }

        return res;
    }
    friend BigNum operator + (BigNum a, int b)
    {
        BigNum res;
        res = b;

        res = res + a;

        return res;
    }
    friend BigNum operator - (BigNum a, BigNum b)
    {///b值小,先比较在进行相减
        BigNum res;

        b.op = b.op * -1;

        if(a.op == b.op)
            res = a + b;
        else
        {
            if(a <= b)
                swap(a, b);

            res.size = a.size;
            res.op = a.op;

            for(int i=0; i<res.size; i++)
            {
                if(i < b.size)
                    res.num[i] = a.num[i] - b.num[i];
                else
                    res.num[i] = a.num[i];
            }
            res.BorrowBit();
        }
        return res;
    }
    friend BigNum operator - (BigNum a, int b)
    {
        BigNum res;
        res = b;

        res = a - res;

        return res;
    }
    void CarryBit()
    {///进位,注意减法的时候进位结果需要是非负数
        for(int i=0; i<size; i++)
        {
            if(num[i] >= 10)
            {
                if(i+1==size)
                {
                    num[i+1] = 0;
                    size += 1;
                }
                num[i+1] += num[i]/10;
                num[i] %= 10;
            }
        }
        while(size > 1 && !num[size-1])
            size--;
        if(size == 1 && !num[0])
            op = 1;
    }
    void BorrowBit()
    {
        for(int i=0; i<size; i++)
        {
            if(num[i] < 0)
            {
                num[i] += 10;
                num[i+1] -= 1;
            }
        }

        while(size > 1 && !num[size-1])
            size--;

        if(size == 1 && !num[0])
            op = 1;
    }
    void Out()
    {
        if(op == -1)
            printf("-");
        for(int i=size-1; i>=0; i--)
            printf("%d", num[i]);
        printf("\n");
    }
};

int main()
{
    BigNum a, b;

    a.Cin();
    b.Cin();

    a = a * b;

    a.Out();

    return 0;
}

 

posted @ 2015-10-09 17:35  无忧望月  阅读(176)  评论(0编辑  收藏  举报
levels of contents