笔试题56. LeetCode OJ (43)
来源:互联网 发布:mkv格式播放器 mac 编辑:程序博客网 时间:2024/06/03 16:33
这个题是个大数乘法运算的题,两个乘数以string的形式给出,求他们相乘的结果,题目给的限制条件是:
1.所给的数字可以任意的大,但是不为负数
2.不能将题目所给的string转化为整数
3.不能引入大数运算相关的库
从题目的描述中我知道了这个题让我们自己去实现大数运算的乘法,就是这么个意思,那么我们开始吧:在纸上算的时候我们都会,可是用程序去做的时候就比较难了吧,而且乘法运算从右往左运算的,我们怎么往string的头部插入一个字符串呢?不用担心,我们请看下图:
既然从右往左运算的时候字符串不好操作,那么我们就将从右往左运算的结果从左往右存储,最后再反转字符串就可以解决了,这样的做法还有一些其他问题需要注意,比如 0 的处理,什么地方得添加 0 ,什么位置不用添加 0;还有就是进位的处理,写了两个函数一个用来计算乘法一个用来处理进位问题,因为我发现这两个功能不能复用,那么请看我的代码吧,其中有很多细节的地方需要注意,这道题考的就是细心的程度!
class Solution {public:string multiply(string num1, string num2){/*这个题的意思是返回两个大数相乘的结果两个乘数可以很大且非负不能将字符串转化为int不能使用大数相关的库*/string ret = "";int sz1 = num1.size();int sz2 = num2.size(); if (sz1 == 1 && num1[0] == '0' || sz2 == 1 && num2[0] == '0'){ret.push_back('0');return ret;}//先往右进位,最后将结果逆置一下for (int i = sz1-1; i >=0; --i){int begin = sz1 - i - 1;for (int j = sz2-1; j >= 0; --j){int tmp = (num1[i] - '0') * (num2[j] - '0');carrybit(ret, begin, tmp);++begin;}}//逆序reverse(ret);return ret;}void carrybit(string& str, int begin, int num){const int first = begin;if (num == 0){if (begin >= str.size()){ // 相乘的结果为 0 且出现在最后面的位置,这个时候得补上0,否则缺位str.push_back('0');}}while (num){int cur = num % 10;if (begin >= str.size()){//在最后面的位置上添加的时候得添加‘字符’str.push_back(cur + '0');++begin;}else{//在中间的位置上只需要加‘整数’str[begin++] += cur;}num /= 10;}//判断当前位是否产生进位int bigger = str[first] - '0';if (bigger >= 10){//判断当前位是否产生了进位,若进位则处理进位curcarrybit(str, first, bigger);}}//进位处理函数void curcarrybit(string &str, int begin, int num){int first = begin;while (num){int cur = num % 10;if (begin >= str.size()){str.push_back(cur + '0');++begin;}else{if (first == begin){//当前位产生进位,留下余下的,所以用赋值语句str[begin++] = (cur + '0');}else{//进位的数目补到后面的位置上str[begin++] += cur;}}num /= 10;}}//翻转字符串void reverse(string & s){int right = s.size() - 1;int left = 0;while (left < right){swap(s[left], s[right]);++left;--right;}}};最终结果如下:
我觉得这个题我是按照乘法原则一步一步去实现的,这种的做法好像不是最优的,但是我没有想出更优的方法来,不知道看到我的文章的人有没有更优的方法,如果有的话希望画上你几秒钟的时间指点指点。
0 0
- 笔试题56. LeetCode OJ (43)
- 笔试题14. LeetCode OJ (1)
- 笔试题15. LeetCode OJ (2)
- 笔试题16. LeetCode OJ (3)
- 笔试题17. LeetCode OJ (4)
- 笔试题18. LeetCode OJ (7)
- 笔试题19. LeetCode OJ (5)
- 笔试题20. LeetCode OJ (6)
- 笔试题21 . LeetCode OJ (8)
- 笔试题22. LeetCode OJ (9)
- 笔试题23. LeetCode OJ (10)
- 笔试题24. LeetCode OJ (11)
- 笔试题25. LeetCode OJ (12)
- 笔试题26. LeetCode OJ (13)
- 笔试题27. LeetCode OJ (14)
- 笔试题28. LeetCode OJ (15)
- 笔试题29. LeetCode OJ (16)
- 笔试题30. LeetCode OJ (17)
- VC++2008 如何使用Windows Media Player控件
- jsp中转发和重定向的区别
- 对于二分法,每次的if判断
- Map的按value值排序
- Binder学习笔记(四)—— ServiceManager如何响应checkService请求
- 笔试题56. LeetCode OJ (43)
- Eclipse maven构建项目
- 有趣的Html
- mysql分区表的维护
- Apache ActiveMQ启动DEMO错误
- Binder学习笔记(五)—— Parcel是怎么打包的?
- Android 添加背景音乐代码实现,以及创建音频文件夹
- 网络流二十四题之十八 —— 分配问题
- 239. Sliding Window Maximum