3.19高精度的加减乘除

高精度加法

加运算步骤

1 从低位到高位(相当于是字符串翻转) ,比较他们的长度,长度不一致,在在前方补'0'

num2=string(len1-len2,'0')+num2;

2 然后将他们的同位相加,注意 string result="";

  • 转化为数字再相加,并且进位carry=0(初始化)         sum=(num1[i]-'0')+(num2[i]-'0')+carry;

  • 获取进位数和结果数的一部分            

    result=(char)(sum%+'0')+result

    carry=sum/10;

3 判断最高位是否进位

if(carry>0)
    result=char(carry+‘0)+result
#include<bits/stdc++.h>
using namespace std;

string add(string num1, string num2) {
    if(num1.empty() && num2.empty()) return "0";  // 如果两个输入都是空字符串,返回 "0"
    
    int len1 = num1.length();
    int len2 = num2.length();
    
    // 保证 num1 总是更长的字符串
    if(len1 < len2) {
        swap(num1, num2);
    }
    
    // 将较短的字符串补零
    num2 = string(len1 - len2, '0') + num2;
    
    string result = "";
    int sum = 0;
    int carry = 0;
    
    // 从个位开始计算
    for(int i = len1 - 1; i >= 0; i--) {
        sum = (num1[i] - '0') + (num2[i] - '0') + carry;
        result = (char)(sum % 10 + '0') + result;  // 计算当前位的数字
        carry = sum / 10;  // 计算进位
    }
    
    // 如果最终有进位,添加进位到结果
    if(carry > 0) {
        result = (char)(carry + '0') + result;
    }
    
    return result;
}

int main() {
    string num1, num2;
    cin >> num1 >> num2;
    
    // 检查输入是否有效
    if (num1.empty() || num2.empty()) {
        cout << "Invalid input!" << endl;
        return 1;  // 返回错误状态
    }
    
    cout << add(num1, num2) << endl;  // 输出结果
    return 0;
}

高精度减法

1比较长度,补'0'

num2=string(len1-len2,'0')+num2;

2 同位计算他们的差值

int boorow=0;
int diff=(num1[i]-'0')-(num2[i]-'0')-borrow;
    if(diff<0){
        //需要借位
        diff+=10;
        borrow=1;
    }
else{
    borrow=0;
}
  result = char(diff + '0') + result;


//这个不需要交换,相减可能会出现负数
// 确保a是较长的字符串
    if (a.length() < b.length()) {
        cout << "-" << subtract(b, a) << endl;
    } else {
        cout << subtract(a, b) << endl;
    }

3 删除前置的0

int count=0//算算前置的0有多少个

for(int i=0;i<result.length()-1;i++){
    if(result[i]!='0'){
        break;
        
    }
    count++;
    
}
result=result.substr(count);

#include <iostream>
#include <string>

using namespace std;

// 高精度减法函数
string subtract(string num1, string num2) {
    if (num1.length() < num2.length()) {
        swap(num1, num2);
    }
    int len1 = num1.length();
    int len2 = num2.length();
    // 在较短的字符串前补0,使两个字符串长度相同
    num2 = string(len1 - len2, '0') + num2;
    string result = "";
    int borrow = 0;
    for (int i = len1 - 1; i >= 0; --i) {
        int diff = (num1[i] - '0') - (num2[i] - '0') - borrow;
        if (diff < 0) {
            diff += 10;
            borrow = 1;
        } else {
            borrow = 0;
        }
        result = char(diff + '0') + result;
    }
    // 删除结果中的前导0
    int count = 0; // 初始化count变量
    for (int i = 0; i < result.length(); ++i) {
        if (result[i] != '0') {
            break;
        }
        count++;
    }
    if (count == result.length()) {
        result = "0";
    } else {
        result = result.substr(count);
    }
    return result;
}

int main() {
    string a, b;
    cin >> a >> b;
    // 确保a是较长的字符串
    if (a.length() < b.length()) {
        cout << "-" << subtract(b, a) << endl;
    } else {
        cout << subtract(a, b) << endl;
    }
    return 0;
}

高精度乘法

  1. 逐位相乘,从被乘数的最低位开始,逐位与乘法相乘,得到部分乘积,需要记录每一步的部分乘积,并考虑进位的情况

  2. 部分乘积相加,得到部分乘积后,将所有的乘积相加,得到相加的过程中,需要考虑进位

  3. 处理进位:在逐位相乘和部分乘积相加的过程中,需要考虑进位的情况。确保进位的正确处理,不会遗漏或错误处理进位情况。

  4. 处理小数部分:如果需要进行高精度乘法,可能会涉及到小数部分的处理。在进行乘法操作后,需要继续处理小数部分,直到达到指定的精度要求。

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    // 高精度乘法函数
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        int len1 = num1.size(), len2 = num2.size();
        vector<int> result(len1 + len2, 0);
    
        // 逐位相乘并累加
        for (int i = len1 - 1; i >= 0; --i) {
            for (int j = len2 - 1; j >= 0; --j) {
                int mul = (num1[i] - '0') * (num2[j] - '0');
                int ssum = mul + resuslt[i + j + 1];
                result[i + j + 1] = sum % 10;
                result[i + j] += sum / 10;
            }
        }
        //result[i+j+1]是保存十位, result[i+j]是保存个位
    //    result[i + j + 1] 用于存储从 result[i + j] 进位上来的值。在进行下一位乘法之前,我们需要将这个进位加到新的乘积上。  
        //当我们逐位相乘时,num1[i] * num2[j] 的结果可能会影响 result 数组中的两个位置:
    //result[i + j]:这个位置存储的是乘积的个位数。
    //result[i + j + 1]:这个位置存储的是乘积的十位数,也就是进位。
    
        // 将结果转换为字符串
        string res = "";
        for (int i = 0; i < result.size(); ++i) {
            if (i == 0 && result[i] == 0) continue; // 跳过前导零
            res.push_back(result[i] + '0');
        }
        //行代码的作用是检查数组 result 的第一个元素是否为0。如果是,那么这个0就不会被添加到结果字符串 res 中。这里的 i 是 for 循环的索引变量,它从0开始,逐个访问 result 数组中的每个元素。
        if (res.empty()) return "0";
        reverse(res.begin(), res.end());
        return res;
    }
    
    int main() {
        string a, b;
        cin >> a >> b;
        cout << multiply(a, b) << endl;
        return 0;
    }

    方法二:使用双层for循环

  5. 代码如下

    #include <iostream>
     
    using namespace std;
     
    const int N = 2010;
     
    int a[N], b[N], c[N];
    int la, lb, lc;
     
    void mul(int c[], int a[], int b[])
    {
    	for (int i = 0; i < la; i++)
    	{
    		for (int j = 0; j < lb; j++)
    		{
    			c[i + j] += a[i] * b[j]; // 无进位乘法
    		}
    	}
    	// 处理进位
    	for (int i = 0; i < lc; i++)
    	{
    		c[i + 1] += c[i] / 10;
    		c[i] %= 10;
    	}
    	while (lc != 1 && c[lc - 1] == 0) lc--;
    }
     
    int main()
    {
    	string x, y; cin >> x >> y;
    	la = x.size(); lb = y.size(); lc = la + lb;
     
    	for (int i = la - 1; i >= 0; i--) a[la - 1 - i] = x[i] - '0';
    	for (int i = lb - 1; i >= 0; i--) b[lb - 1 - i] = y[i] - '0';
     
    	mul(c, a, b);// c = a * b;
     
    	for (int i = lc - 1; i >= 0; i--) cout << c[i];
     
    	return 0;
    }

    高精度除法

    目录

    高精度减法

    高精度乘法

    高精度除法


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值