2022.2.26# 高精度四则运算

大数的类:

class big_num {
public:
    int s[maxn+10] = { 0 };//采用int数组
    inline void clear();
    inline void read();
    inline void display();
    inline big_num add(big_num a1);
    inline big_num sub(big_num a1);
    inline big_num low_mul(int a1);
    inline big_num big_mul(big_num a1);
    inline big_num* div(big_num a1);
};

基准操作:

inline void big_num::clear()
{
    for (int i = 0;i <= maxn;i++)
        s[i] = 0;
}
inline void big_num::read()
{
    char read_char[maxn];
    scanf_s("%s", read_char,maxn);
    int len = strlen(read_char);
    clear();
    for (int i = len - 1;i >= 0;i--)
        s[len-1-i] = read_char[i]-'0';
}
inline void big_num::display()
{
    int i = maxn - 1;
    while (s[i] == 0)
        i--;
    for (int j = i;j >= 1;j--)
        printf("%d", s[j]);//此处为预防输出0的场景
    printf("%d\n", s[0]);
}

加减同理可得:

inline big_num big_num::add(big_num a1)
{
    big_num res;
    for (int i = 0;i < maxn;i++)
    {
        res.s[i] += s[i] + a1.s[i];
        if (res.s[i] >= 10)
        {
            res.s[i + 1] += 1;
            res.s[i] -= 10;
        }
    }
    return res;
}

inline big_num big_num::sub(big_num a1)
{
    big_num res;
    for (int i = 0;i < maxn;i++)
    {
        res.s[i] += s[i] - a1.s[i];
        if (res.s[i] < 0)
        {
            res.s[i + 1] -= 1;
            res.s[i] += 10;
        }
    }
    return res;

}

乘法分为低精度和高精度:

inline big_num big_num::low_mul(int a1)
{
    big_num res;
    for (int i = 0;i < maxn;i++)
    {
        res.s[i] += s[i] * a1;
        if (res.s[i] >= 10)
        {
            res.s[i + 1] += res.s[i] / 10;
            res.s[i] = res.s[i] % 10;
        }
    }
    return res;

}
inline big_num big_num::big_mul(big_num a1)
{
    big_num res;
    for (int i = 0;i < maxn;i++)
    {
        for (int j = 0;j <= i;j++)
            res.s[i] += s[j] * a1.s[i - j];
        if (res.s[i] >= 10)
        {
            res.s[i + 1] += res.s[i] / 10;
            res.s[i] = res.s[i] % 10;
        }
    }
    return res;
}

除法比较困难:

inline bool panduan(big_num a,big_num b,int i,int lenb)
{
    if (a.s[i + lenb] > 0)
        return true;
    for (int j = lenb;j >= 0;j--)
    {
        if (a.s[j+i] > b.s[j])
            return true;
        if (a.s[j+i] < b.s[j])
            return false;
    }
    return true;
}

inline big_num* big_num::div(big_num a1)
{
    big_num res[2];
    big_num beichu_yushu, shang;
    int len1=maxn-1, len_a1=maxn-1,len_cha;
    while (s[len1] == 0)
        len1--;
    while (a1.s[len_a1] == 0)
        len_a1--;
    len1++;
    len_a1++;
    if (len_a1 == 0)
    {
        cout << "a1 mustn't 0"<<endl;
        return res;
    }
    len_cha = len1 - len_a1;
    for (int i = 0;i <= len1;i++)
        beichu_yushu.s[i] = s[i];
    for (int i = len_cha;i >= 0;i--)
    {
        while (panduan(beichu_yushu, a1, i, len_a1))
        {
            for (int j = 0;j < len_a1;j++)
            {
                beichu_yushu.s[j+i] -= a1.s[j];
                if (beichu_yushu.s[j+i] < 0)
                {
                    beichu_yushu.s[i+j + 1] -= 1;
                    beichu_yushu.s[i+j] += 10;
                }
            }
            shang.s[i]++;
        }
    }
    res[0] = shang;
    res[1] = beichu_yushu;
    return res;
}

 

posted @ 2022-02-26 00:10  Tiachi  阅读(28)  评论(0)    收藏  举报