大整数乘法--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; }};
阅读全文