大整数乘法--leetcode Multiply Strings

来源:互联网 发布:淘宝怎么装修店铺首页 编辑:程序博客网 时间:2024/05/18 22:46

大整数乘法

本文转载自http://www.cnblogs.com/TenosDoIt/p/3735309.html
我们在日常的大整数计算中,通常是把它转化为字符型计算。这道题的思路就和我们小学计算乘法一样,
想乘的的结果,错位相加,最终进位,得到我们 的结果。


题干如下:

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.Note:   The length of both num1 and num2 is < 110.    Both num1 and num2 contains only digits 0-9.    Both num1 and num2 does not contain any leading zero.    You must not use any built-in BigInteger library or     convert the inputs to integer directly.

思路很简单,实现有点绕:
这里引用了JustDoIT博客的内容,分析如下:

289*785为例:

这里写图片描述

首先我们把每一位相乘,得到一个没有进位的临时结果,如图中中间的一行红色数字就是临时结果,然后把临时结果从低位起依次进位。对于一个m位整数乘以n位整数的结果,最多只有m+n位。
注意:结果中需要去掉前导0,还需要注意结果为0的情况


代码如下:

class Solution {public:    string multiply(string num1, string num2) {          int s1 = num1.size();        int s2 = num2.size();        if(num1 == "0" || num2 == "0")return "0";        int k = s1+s2-2;        if(k <= 0){}        vector<int>v(s1+s2,0);        for(int i = 0; i<s1;i++) //未进位            for(int j = 0;j<s2;j++){                v[k-i-j]+=(num1[i]-'0')*(num2[j]-'0');            }        int carry = 0;        for(int i = 0;i<s1+s2;i++){ //进位            v[i]+=carry;            carry = v[i]/10;            v[i] = v[i]%10;        }        reverse(v.begin(),v.end());        int u = 0;        while(v[u] == 0)u++; //去掉前面的0        string res = "";        for(int i = u;i<v.size();i++)            res+=v[i]+'0';        return res;    }};
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 雷欧时手表怎么样 都市之万界创造 雷欧尼克斯 雷氏 雷氏催乳汤 雷氏家族 雷汉 雷沃 雷沃收割机 雷沃欧豹 雷沃发动机 雷沃1504 雷沃价格 雷沃汽车 雷沃玉米收割机 雷沃玉米收割机2018款多少钱 雷沃拖拉机价格表 雷沃拖拉机报价 雷沃拖拉机价格表2018 雷沃拖拉机价格 雷沃玉米收割机2018款 2018新款雷沃554补完多少钱 雷沃自走式花生摘果机 雷沃1304补贴完价格表 雷沃1004补贴完价格 雷沃玉米收割机2017款 东方红和雷沃哪个耐用 雷沃玉米收割机价格 雷沃6缸1304补贴完价格 福田雷沃拖拉机 2018新款雷沃704补完多少钱 2018年雷沃玉米收割机价格 2018年福田雷沃1804补贴价格表 雷沃大型收割机多少钱 福田雷沃玉米收割机 雷沃1000拖拉机 雷沃拖拉机多少钱 雷沃收割机价格 雷沃拖拉机1000价格表 雷沃小麦收割机ge90 雷沃收割机价格表 雷法为王