• 大数相乘


    大数相乘运算

    由于数字无法用一个整形变量存储,很自然的想到用字符串来表示一串数字。然后按照乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将所有中间结果按正确位置相加得到最终结果。可以分析得出如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。因此可以分配一个m+n的辅存来存储最终结果。为了节约空间,所有的中间结果直接在m+n的辅存上进行累加。、

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    //大数相乘
    /**
    *num1 乘数1
    *num2 乘数2
    *return 结果字符串
    */
    string BigMutiple(string num1, string num2){
    
        string res="";
        //两个数的位数
        int m = num1.size(), n = num2.size();
    
        //一个i位数乘以一个j位数,结果至少是i+j-1位数
        vector<long long> tmp(m + n - 1);
    
        //每一位进行笛卡尔乘法
        for (int i = 0; i < m; i++){
             int a = num1[i] - '0';
            for (int j = 0; j < n; j++){
                int b = num2[j] - '0';
                tmp[i + j] += a*b;
            }
        }
        //进行进位处理,注意左侧是大右侧是小
        int carry = 0;
        for (int i = tmp.size() - 1; i >= 0; i--){
            int t = tmp[i] + carry;
            tmp[i] = t % 10;
            carry = t / 10;
        }
        //若遍历完仍然有进位
        while (carry != 0){
            int t = carry % 10;
            carry /= 10;
            tmp.insert(tmp.begin(), t);
        }
        //将结果存入到返回值中
        for (auto a : tmp){
            res = res + to_string(a);
        }
        if(res.size()>0&&res[0]=='0')return "0";
        return res;
    
    }
    
    //测试函数
    int main(){
        string num1, num2;
        while (cin >> num1 >> num2){
            cout << BigMutiple(num1, num2) << endl;
        }
        return 0;
    }
  • 相关阅读:
    计算机网络拓扑结构
    中继器,集线器,网桥,交换机,路由器
    网络层次模型
    广播域和冲突域
    Tomcat
    Log4j
    Eclipse实用快捷键
    WebService是什么?
    定时任务处理-Quartz
    MySQL内存表-临时表
  • 原文地址:https://www.cnblogs.com/ktao/p/8655031.html
Copyright © 2020-2023  润新知