标签:
这道题就是模拟乘法思维了,还需要模拟加法思维,每一位乘以一个数都要和前面的结果加起来。
注意:
1 要把这两个操作过程分清楚,不能混饶了,否则会结果不正确的。
2 乘法有进位,和前面的结果加起来也有加法进位,一定要分清楚。
3 每一次一个新数位与被乘数相乘之前,都一定要把两个进位加在结果上。
4 同时需要把两个进位值都清零。
class Solution { public: string multiply(string num1, string num2) { int n1 = num1.length(); int n2 = num2.length(); if(n1 == 0 || n2 == 0) return "0"; int upto = 0; int sumupto = 0; string sum; int s = 0; sum.resize(n1+n2, ‘0‘); int i, j; for (i = n1-1; i >= 0; i--) { int a = num1[i] - ‘0‘; //注意:每次新开始upto进位值都要清零 for (j = n2-1, upto = 0; j >= 0; j--) { int b = num2[j] - ‘0‘; s = b * a + upto; upto = s / 10; //注意:要系统分析,先计算出乘法,处理好,之后再处理加法。 int rmd = s%10; int sij1 = sum[i+j+1] - ‘0‘; int rs = rmd + sij1 + sumupto; sumupto = rs/10; rs %= 10; sum[i+j+1] = rs + ‘0‘; } //注意:把最后一次的进位值加上! //注意:要把加法进位和乘法进位都加上 sum[i+j+1] += (upto+sumupto); //注意:加法进位一定需要清零 sumupto = 0; } while (sum.length() > 1 && sum[0] == ‘0‘) sum.erase(sum.begin()); return sum; } };
标签:
原文地址:http://www.cnblogs.com/qiaozhoulin/p/4569641.html