高精度加减乘除模板
内容纲要

高精度

高精度。顾名思义,就是在很大的位数情况下进行运算。(炸int)

其基本思想就是用数组进行模拟加法。

// 比较两个字符串的大小, 先从长度比较,再从字符串前几位比较
int compare(string str1, string str2)
{
    if (str1.length() > str2.length())
        return 1;
    else if (str1.length() < str2.length())
        return -1;
    else
        return str1.compare(str2);
}

/*加法*/
string add(string a, string b)
{
    string c;
    int length1 = a.size();
    int length2 = b.size();
    // 补0对齐字符长度
    int maxlength = max(length1, length2);
    a = string(maxlength - length1, '0') + a;
    b = string(maxlength - length2, '0') + b;
    int jin = 0;
    int tmp = 0;
    for (int i = maxlength - 1; i >= 0; i--)//从最个位开始逐位相加
    {
        tmp = ((a[i] - '0') + (b[i] - '0') + jin) % 10;//计算当前位的值
        jin = ((a[i] - '0') + (b[i] - '0') + jin) / 10;//计算当前位的进位
        c = char(tmp + '0') + c;
    }
    if (jin != 0)//如果最高位仍然有进位,直接插入到c的最前面
        c = char(jin + '0') + c;
    return c;
}

/*减法*/
string sub(string a, string b)
{
    if (a == b)
        return "0";
    string c;
    bool isNegative = false;//判断是否为负数
    int length1 = a.size();
    int length2 = b.size();
    // 补0对齐字符长度
    int maxlength = max(length1, length2);
    a = string(maxlength - length1, '0') + a;
    b = string(maxlength - length2, '0') + b;
    int tui = 0;
    int tmp = 0;
    if (a < b) // a-b<0时转化为-(b-a)
    {
        swap(a, b);
        isNegative = true;
    }
    // 此时a一定大于b
    for (int i = maxlength - 1; i >= 0; i--)
    {
        tmp = (a[i] - '0') - (b[i] - '0') - tui;//考虑借位后,计算当前位的值
        tui = 0;//重置借位
        if (tmp < 0)//判断当前位的值小于0,需要借位
        {
            tmp += 10;//借位后相当于当前位加10
            tui = 1;
        }
        c = char(tmp + '0') + c;//将当前位的值插入到c的最前面
    }
    // 移除开头的无用0
    c.erase(0, c.find_first_not_of('0'));
    if (isNegative)//如果是负数,加上负号
        c = '-' + c;
    return c;
}

/*乘法*/
string mul(string a, string b)
{
    if (a == "0" || b == "0")
        return "0";
    string c, mul = "0";
    int length1 = a.size();
    int length2 = b.size();
    int tmp = 0, jin;
    for (int i = length1 - 1; i >= 0; i--)//从个位开始逐位相乘
    {
        c = "";
        jin = 0;
        for (int j = length2 - 1; j >= 0; j--)//逐位相乘
        {
            tmp = ((a[i] - '0') * (b[j] - '0') + jin) % 10;//当前位的值
            jin = ((a[i] - '0') * (b[j] - '0') + jin) / 10;//当前位的进位
            c = char(tmp + '0') + c;//将当前位的值插入到c的最前面记录积
        }
        if (jin != 0)//如果最高位仍然有进位,直接插入到c的最前面例如61*2=122
            c = char(jin + '0') + c;

        for (int k = i; k < length1 - 1; k++)//在c的最后补0,相当于乘10,100,1000...
        {
            c += '0';
        }

        mul = add(mul, c);//竖式计算的积累加
    }
    return mul;
}

/*除法*/
string div(string a, string b)
{
    string quotient = "";
    string tmp;
    if (b == "0")//如果除数为0,直接返回空字符串
        return "";
    if (a == "0")//如果被除数为0,直接返回0
        return "0";

    if (compare(a, b) < 0)//如果被除数小于除数,直接返回0
        return "0";
    else if (compare(a, b) == 0)//如果被除数等于除数,直接返回1
        return "1";
    else
    {
        int length1 = a.size();
        int length2 = b.size();
        tmp.append(a, 0, length2 - 1);//取被除数的 除数长度-1位,这样第一次试商就和除数一样长且和后面循环操作一样
        for (int i = length2 - 1; i < length1; i++)
        {
            tmp = tmp + a[i];//试商的临时被除数每次都是上一次的余数加上新的一位
            //试商
            for (char ch = '9'; ch >= '0'; ch--)
            {
                string tempstr;
                string str(1, ch);//将字符ch转化为字符串
                // 注意!!!这里不能用to_string(ch),使用to_string 方法会转化为char对应的ascii码
                // 原因是 to_string 没有接受char型参数的函数原型,有一个参数类型为int 的函数原型,
                // 所以传入char型字符 实际是先将char 转化为 int 型的 ascii 码,然后再转变为string
                tempstr = mul(str, b);
                if (compare(tempstr, tmp) <= 0)
                {
                    quotient += str;//商的每一位
                    tmp = sub(tmp, tempstr);
                    break;
                }
            }
            //注意去掉前导0的操作要放在每次除法循环的最后
            tmp.erase(0, tmp.find_first_not_of('0'));
        }
    }
    quotient.erase(0, quotient.find_first_not_of('0'));//去掉前导0
    return quotient;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇