crosaa 2023-09-19 21:18 采纳率: 0%
浏览 9

二进制高精度压位算法

c++ 二进制+压位的+-*/%运算的高精度写法怎么写,乘法怎么优化,不用普通的乘法,位运算的

  • 写回答

2条回答 默认 最新

  • 颍川_1024 2023-09-20 01:20
    关注

    在C++中进行高精度的二进制加法、减法、乘法、除法和取模运算通常需要自己实现。以下是一些常见的高精度运算的示例代码以及一种位运算的优化方法:

    1. 高精度加法
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    vector<int> add(vector<int>& a, vector<int>& b) {
        int carry = 0;
        vector<int> result;
        for (int i = 0; i < max(a.size(), b.size()) || carry; i++) {
            if (i == result.size()) result.push_back(0);
            int sum = result[i] + carry + (i < a.size() ? a[i] : 0) + (i < b.size() ? b[i] : 0);
            result[i] = sum % 2;
            carry = sum / 2;
        }
        return result;
    }
    
    1. 高精度减法
    vector<int> subtract(vector<int>& a, vector<int>& b) {
        int borrow = 0;
        vector<int> result;
        for (int i = 0; i < a.size(); i++) {
            int sub = a[i] - borrow - (i < b.size() ? b[i] : 0);
            if (sub < 0) {
                sub += 2;
                borrow = 1;
            } else {
                borrow = 0;
            }
            result.push_back(sub);
        }
        while (!result.empty() && result.back() == 0) result.pop_back();
        return result;
    }
    
    1. 高精度乘法(位运算优化):
    vector<int> multiply(vector<int>& a, vector<int>& b) {
        vector<int> result(a.size() + b.size(), 0);
        for (int i = 0; i < a.size(); i++) {
            for (int j = 0; j < b.size(); j++) {
                result[i + j] += a[i] * b[j];
                if (result[i + j] >= 2) {
                    result[i + j + 1] += result[i + j] / 2;
                    result[i + j] %= 2;
                }
            }
        }
        while (!result.empty() && result.back() == 0) result.pop_back();
        return result;
    }
    
    1. 高精度除法
    pair<vector<int>, int> divide(vector<int>& a, int b) {
        vector<int> result(a.size(), 0);
        int carry = 0;
        for (int i = a.size() - 1; i >= 0; i--) {
            int dividend = carry * 2 + a[i];
            result[i] = dividend / b;
            carry = dividend % b;
        }
        while (!result.empty() && result.back() == 0) result.pop_back();
        return {result, carry};
    }
    
    1. 高精度取模
    int mod(vector<int>& a, int b) {
        int carry = 0;
        for (int i = 0; i < a.size(); i++) {
            int dividend = carry * 2 + a[i];
            carry = dividend % b;
        }
        return carry;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月19日

悬赏问题

  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢
  • ¥50 paddleocr最下面一行似乎无法识别
  • ¥15 求某类社交网络数据集
  • ¥15 靶向捕获探针方法/参考文献
  • ¥15 很抱歉出现错误word不能启动(24),如何解决?