高精度整数(大整数)四则运算模板

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int Maxn = 100010;

struct bign //大整数结构体
{
    int d[Maxn];
    int len;
    bign()
    {
        memset(d,0,sizeof(d)); //也可用fill()
        len = 0;
    }
};

bign chang(char str[]) //将字符串转化为大整数
{
    bign a;
    a.len = strlen(str);  //字符串长度就是整数的数位
    for(int i = 0;i<a.len;i++)
    {
        a.d[i] = str[a.len - 1 - i]; //倒着赋值
    }
    return a;
}

int compare(bign a,bign b)
{
    if(a.len > b.len) return 1;//a比较大
    else if(a.len < b.len) return -1;
    else
    {
        for(int i = a.len - 1;i>=0;i--)
        {
            if(a.d[i] > b.d[i])
                return 1;
            else if(a.d[i] < b.d[i])
                return -1;
        }
        return 0;           //2数相等
    }
}

bign add(bign a,bign b) //高精度加法
{
    bign c;
    int carry = 0; //设置进位
    for(int i = 0;i<a.len || i<b.len;i++) //小于较大的数位
    {
        int temp;
        temp = a.d[i] + b.d[i] + carry;
        c.d[c.len++] = temp % 10;
        carry = temp / 10;
    }
    if(carry != 0) //最后进位不为0的话就直接赋值carry
    {
        c.d[c.len++] = carry;
    }
    return c;
}

bign sub(bign a,bign b) //高精度减法
{
    bign c;
    for(int i = 0;i<a.len || i<b.len;i++)
    {
        if(a.d[i] < b.d[i])
        {
            a.d[i] += 10; //如果不够减则借位
            a.d[i + 1]--;
        }
        c.d[c.len++] = a.d[i] - b.d[i];
        while(c.len - 1 >= 1 && c.d[c.len - 1] == 0) //保留至少为一位数,并且去掉高位的0
            c.len--;
    }
    return c;
}

bign mul(bign a,int b) //高精度和低精度乘法
{
    bign c;
    int carry = 0; //进位
    for(int i = 0;i<a.len;i++)
    {
        int temp = a.d[i] * b + carry;
        c.d[c.len++] = temp % 10 ;
        carry = temp / 10;
    }
    while(carry > 0) //进位的数位可能大于1位
    {
        c.d[c.len++] = carry % 10;
        carry /= 10;
    }
    return c;
}

bign divi(bign a,int b,int &r) //高精度和低精度的除法
{
    bign c;
    c.len = a.len; //商的结果和被除数一一对应,先让其相等
    for(int i = a.len -1;i>=0;i--)
    {
        r = r * 10 + a.d[i]; //余数加上上一位的余数
        if(r < b) c.d[i] = 0; //不够除
        else //够除
        {
            c.d[i] = r / b;  //商
            r = r % b;  //余数
        }
    }
    while(c.len - 1 >= 1 && c.d[c.len -1] == 0)
        c.len--;

    return c;
}


int main()
{
    freopen("1.txt","r",stdin);
    return 0;
}

发布了112 篇原创文章 · 获赞 4 · 访问量 3657

猜你喜欢

转载自blog.csdn.net/qq_15556537/article/details/104099952
今日推荐