大整数计算(C++模板)

大整数计算(C++模板)

计算机存储整数的大小是有限,long long最多只能存储64位的,int只能存储32位的。当我们计算一些超过64位的整数的时候就需要另外想办法。这就是大整数运算。在复试上机题中也屡屡出现。整理了大整数计算得一些模板,但是需要注意的是只能进行正整数的计算,在进行减法的时候小数减大数会出错。机试要用什么计算,只需要敲当中相对应的代码就行了。(代码参考于计算机考研-机试指南,但是书上的代码在计算减法、乘法、除法是有错误的,我改了过来。在下面的代码中我会把错的地方标记出来
这里给一个计算大数加法模板题目

直接上代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
const int MAXN = 10000;
struct BigInteget
{
    int digit[MAXN];
    int length;
    BigInteget();
    BigInteget(int x);
    BigInteget(string str);
    BigInteget(const BigInteget& b);
    BigInteget operator =(int x);
    BigInteget operator =(string str);
    BigInteget operator =(const BigInteget& b);
    bool operator <=(const BigInteget& b);
    bool operator ==(const BigInteget& b);
    BigInteget operator +(const BigInteget& b);
    BigInteget operator -(const BigInteget& b);
    BigInteget operator *(const BigInteget& b);
    BigInteget operator /(const BigInteget& b);
    BigInteget operator %(const BigInteget& b);
    friend istream& operator>>(istream& in, BigInteget& x);
    friend ostream& operator<<(ostream& out, const BigInteget& x);
};

istream& operator>>(istream& in, BigInteget& x)
{
    string str;
    in >> str;
    x = str;
    return in;
}

ostream& operator<<(ostream& out, const BigInteget& x)
{
    for(int i = x.length-1; i >= 0; i--)
        out << x.digit[i];
    return out;
}

BigInteget::BigInteget()
{
    memset(digit, 0, sizeof(digit));
    length = 0;
}

BigInteget::BigInteget(int x)
{
    memset(digit, 0, sizeof(digit));
    length = 0;
    if(x == 0)
        digit[length++] = x;
    while(x)
    {
        digit[length++] = x % 10;
        x /= 10;
    }
}

BigInteget::BigInteget(string str)
{
    memset(digit, 0, sizeof(digit));
    length = str.size();
    for(int i = 0; i < length; i++)
        digit[i] = str[length-i-1] - '0';
}


BigInteget::BigInteget(const BigInteget& b)
{
    memset(digit, 0, sizeof(digit));
    length = b.length;
    for(int i = 0; i < length; i++)
        digit[i] = b.digit[i];
}

BigInteget BigInteget::operator=(int x)
{
    memset(digit, 0, sizeof(digit));
    length = 0;
    if(x == 0)
        digit[length++] = x;
    while(x)
    {
        digit[length++] = x % 10;
        x /= 10;
    }
    return *this;
}

BigInteget BigInteget::operator=(string str)
{
    memset(digit, 0, sizeof(digit));
    length = str.size();
    for(int i = 0; i < length; i++)
        digit[i] = str[length-i-1] - '0';
    return *this;
}

BigInteget BigInteget::operator=(const BigInteget& b)
{
    memset(digit, 0, sizeof(digit));
    length = b.length;
    for(int i = 0; i < length; i++)
        digit[i] = b.digit[i];
    return *this;
}


bool BigInteget::operator<=(const BigInteget& b)
{
    if(length < b.length)
        return true;
    else if (b.length < length)
        return false;
    else
    {
        for(int i = length -1; i >= 0; i--)
        {
            if(digit[i] == b.digit[i])
                continue;
            else
                return digit[i] < b.digit[i];
        }
    }
    return true;
}

bool BigInteget::operator==(const BigInteget& b)
{
    if(length != b.length)
        return false;
    else
    {
        for(int i = length -1; i >= 0; i--)
        {
            if(digit[i] != b.digit[i])
                return false;
        }
    }
    return true;
}



BigInteget BigInteget::operator+(const BigInteget& b)
{
    BigInteget answer;
    int carry = 0;
    for(int i = 0; i < length || i < b.length; i++)
    {
        int current = carry + digit[i] + b.digit[i];
        carry = current /10;
        answer.digit[answer.length++] = current % 10;
    }
    if(carry)
    {
        answer.digit[answer.length++] = carry;
    }
    return answer;
}

BigInteget BigInteget::operator-(const BigInteget& b)
{
    BigInteget answer;
    int carry = 0;
    for(int i = 0; i < length; i++)
    {
        int current = digit[i] - b.digit[i] - carry;
        if(current < 0)
        {
            current += 10;
            carry = 1;
        }
        else
            carry  = 0;
        answer.digit[answer.length++] = current;
    }
    while(answer.digit[answer.length-1] == 0 && answer.length > 1)
    {//书上在这里写得是answer.digit[answer.length]
        answer.length--;
    }
    return answer;
}

BigInteget BigInteget::operator*(const BigInteget& b)
{
    BigInteget answer;
    answer.length = length + b.length;
    for(int i = 0; i < length; i++)
    {
        for(int j = 0; j < b.length; j++)
            answer.digit[i+j] += digit[i] * b.digit[j];
    }
    for(int i = 0; i < answer.length; i++)
    {
        answer.digit[i+1] += answer.digit[i] / 10;
        answer.digit[i] %= 10;
    }
    while(answer.digit[answer.length-1] == 0 && answer.length > 1)
    { //书上在这里写得是answer.digit[answer.length]
        answer.length--;
    }
    return answer;
}






BigInteget BigInteget::operator/(const BigInteget& b)
{
    BigInteget answer;
    answer.length = length;
    BigInteget remainder = 0;
    BigInteget temp = b;
    for(int i = length -1; i >= 0; i--)
    {
        if(!(remainder.length == 1 && remainder.digit[0] == 0))
        {
            for(int j = remainder.length -1; j >= 0; j--)
                remainder.digit[j+1] = remainder.digit[j];
            remainder.length++;
        }
        remainder.digit[0] = digit[i];
        while(temp <= remainder)
        {
            remainder = remainder - temp;
            answer.digit[i]++;
        }
    }

    while(answer.digit[answer.length-1] == 0 && answer.length > 1)
    {//书上在这里写得是answer.digit[answer.length]
        answer.length--;
    }
    return answer;
}

BigInteget BigInteget::operator%(const BigInteget &b)
{
    BigInteget remainder = 0;
    BigInteget temp = b;
    for(int i = length -1; i >= 0; i--)
    {
        if(!(remainder.length == 1 && remainder.digit[0] == 0))
        {
            for(int j = remainder.length - 1; j >= 0; j--)
                remainder.digit[j+1] = remainder.digit[j];
            remainder.length++;
        }
        remainder.digit[0] = digit[i];
        while(temp <= remainder)
        {
            remainder = remainder - temp;
        }
    }
    return remainder;
}

int main()
{
    BigInteget a, b;
    cin >> a >> b;
    cout << a + b << endl;
    cin >> a >> b;
    cout << a - b << endl;
    cin >> a >> b;
    cout << a * b << endl;
    cin >> a >> b;
    cout << a / b << endl;
    cin >> a >> b;
    cout << a % b << endl;
    return 0;
}

发布了21 篇原创文章 · 获赞 35 · 访问量 2109

猜你喜欢

转载自blog.csdn.net/Mrs_Jiangmengxia/article/details/104971818
今日推荐