(浮点数及整数)高精度乘除法

本文介绍了高精度计算的基本思想,通过模拟笔算过程来处理大整数和浮点数的运算。首先展示了高精度加减法和比较函数的基础代码,接着详细讨论了整数高精度乘法,通过分解成多位数相乘并处理进位。文章还提及了整数高精度除法的实现,强调了试商和取模的关键步骤。对于浮点数运算,提到了加减法只需对齐小数点并补充零,乘法则需记住小数位数,而除法相对复杂,尤其是处理除不尽的情况。
摘要由CSDN通过智能技术生成

思想
高精度计算的核心思想很简单,就是模拟我们笔算的过程,因此,关键在于如何准确地模拟笔算

基础代码
因为高精度乘除法中会用到高精度加减法和比较大小函数,所以就先把加减和比较函数贴出来咯

int compare(string str1,string str2)   //比较字符串型的“数字”大小,相等返回0,大于返回1,小于返回-1
{
    if (str1.length() > str2.length()) return 1; //长度长的整数大于长度小的整数
    else if (str1.length() < str2.length()) return -1;
    else    return str1.compare(str2); //若长度相等,则头到尾按位比较
}


string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {
  //高精度加法
    int sign = 1; //sign 为符号位
    string str;
    if (str1[0] == '-') //如果其中一个是负数,那么可以转化成高精度减法;如果都是负数,那么确定下结果为负数,然后擦除负号后相加
    {
        if (str2[0] == '-') 
        {
            sign = -1;
            str = ADD_INT(str1.erase(0,1),str2.erase(0,1));
        } 
        else 
        {
            str = SUB_INT(str2,str1.erase(0,1));
        }
    } 
    else
    {
        if (str2[0] == '-') 
        {
            str = SUB_INT(str1,str2.erase(0,1));
        }
        else 
        { 
            int L1,L2;
            L1 = str1.length();
            L2 = str2.length();
            if (L1 < L2)              //在长度小的前面加0补齐,使得两数对齐 
            {
                for (int i = 1;i <= L2-L1; i++) str1="0"+str1;
            } 
            else 
            {
                for (int i = 1;i <= L1-L2; i++) str2="0"+str2;
            }
            int int1 = 0,carry = 0; //carry 记录进位
            for (int i = str1.length()-1;i >= 0; i--) 
            {
                int1 = (int(str1[i])-'0'+ int(str2[i])-'0'+carry) % 10;
                carry = (int(str1[i])-'0'+ int(str2[i])-'0'+carry) / 10;
                str = char(int1 + '0') + str;
            }
            if (carry != 0) str = char(carry+'0') + str;
        }
    }

    if ((sign==-1)&&(str[0]!='0')) str="-"+str;    //处理符号位
    return str;
}
string SUB_INT(string str1,string str2) {
  //高精度减法
    int sign=1; //sign 为符号位
    string str;
    int i,j;
    if (str2[0] == '-')    //减一个负数等于加上它的相反数 
    {
        str = ADD_INT(str1,str2.erase(0,1));
    } 
    
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值