zoukankan      html  css  js  c++  java
  • 两个大数相乘,字符串模拟+一定技巧

    本人是通过之前看到的博主知道的,然后今天又碰到了类似的题目,还是要记录一下,不然又忘记还得去找。

    通过用字符串完全模拟两个数相乘,相信大家肯定是能做到了(是不是完全模拟的是不是特TM难受)。但是在模拟的基础上加上一些技巧,效率就变得不一样了,代码也变得简洁了。

    主要想法:把二个乘数的每一位拆分出来(字符串很好做到)分别放到一个数组中(其实乘数本身就是一个字符数组),然后进行两两相乘,得到另一个结果数组。

    表示为 res[i+j] += (num1[i]-'0')*(num[j]-'0'); 其中i表示num1中数字字符的位置,j表示num2中数字字符的位置, -'0'是把数字字符转成数字。

    以下是以:1234*1234为例

    第一步:两两相乘得到结果数组res[i+j] += (num1[i]-'0')*(num[j]-'0');

    画的不好不要介意,哈哈。

     第二步:通过结果数组拿到最终1234*1234的结果字符串字符串。

    代码如下:

    #include <iostream>
    #include <string>
    #include <math.h>
    #include <algorithm>
    #include <vector>
    
    
    using namespace std;
    
    string mulNums(string a, string b) {
        // 创建两两相乘后结果的数组,大小可见。 
        vector<int> res(a.size()+b.size()-1, 0); 
        string ret; 
        // res[i+j] += (num1[i]-'0')*(num[j]-'0');
        for (int i = 0; i < a.size(); i++) {
            for (int j = 0; j < b.size(); j++) {
                res[i+j] += (a[i]-'0')*(b[j]-'0');
            }
        }
        // 结果数组转最终结果 
        int flag = 0;
        int m;
        for (int i = res.size()-1; i >= 0; i--) {
            m = res[i]+flag;
            ret = (char)(m%10+'0')+ret;
            flag = m/10;
        }
        if (flag)
            ret = (char)(flag+'0')+ret;
        return ret;
    }
    
    
    int main() {
        
        cout << mulNums("12345", "67890111") << endl;
        
        return 0;
    }
  • 相关阅读:
    themes、skins
    使用GreyBox实现Ajax模式窗口
    .net最小化到系统托盘
    asp.net自定义控件
    [转]SQL函数的简短说明
    prototype1.4 和1.5
    [转]Oracle PL/SQL 编程手册(SQL大全)
    更新同一张表中的数据的方法
    js中eval()的作用
    asp.net中的中文和特殊字符的处理方式!
  • 原文地址:https://www.cnblogs.com/hello-dummy/p/11713558.html
Copyright © 2011-2022 走看看