大数乘法——逐位与移位算法
来源:互联网 发布:lgd和淘宝 编辑:程序博客网 时间:2024/05/21 06:48
在题目中,总会出现要求用很大很大的数来进行运算,这时候就涉及大数运算,这次首先介绍一下大数乘法的处理。代码经过优化,非常简便
逐位相乘处理进位法
乘积是逐位相乘,也就是
举例:
A=13,B=19
a=(3,1),b=(9,1)
c=(3∗ 9,3∗ 1+1∗ 9,1∗ 1)=(27,12,1)=(7,14,1)=(7,4,2)
C=247
因此,大题思路是:
- 转换并反转,字符串转换为数字并将字序反转;
- 逐位相乘,并处理进位,结果存放在result[i+j]中;
- 消除多余的0;
- 转换并反转,将计算结果转换为字符串并反转。
我将代码优化,尽可能减少代码的书写
#include <iostream>#include <string>#include <algorithm>#include <vector>using namespace std;void multply(string &a, string &b){ string result(a.size()+b.size(),'0');//初始化结果数组 unsigned int c = 0; for(unsigned int i = 0; i < a.size(); i++) { unsigned int j; for(j = 0; j < b.size(); j++) { c += (result[i+j] - '0') + (a[i] - '0')*(b[j] - '0'); result[i+j] = (c % 10) + '0'; c /= 10; } while(c) { result[i+j++] += (c % 10); c /= 10; } } for(unsigned int i = result.size() - 1; i >= 0; i--)//去掉高位0 { if(result[i] != '0') { break; } else { result.erase(result.begin() + i,result.end());//截断后面全0 } } //cout<<result<<endl; reverse(result.begin(),result.end()); cout<<result<<endl;}main(){ string a,b; cin>>a>>b; reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); multply(a,b);}
运行结果:
移位进位法
举例:
因此,大体思路是:
- 转换并反转,字符串转换为数字并将字序反转;
- 移位相乘,并处理进位,结果存放在result[i]中;
- 消除多余的0;
- 转换并反转,将计算结果转换为字符串并反转。
#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;void multply(string a, string b){ string result(a.size()+b.size(),'0');//初始化结果数组 unsigned int c = 0, tmp_i = 0, tmp_j = 0; for(unsigned int i = 0; i!=a.size(); i++, tmp_j++) { tmp_i = tmp_j; //在每次计算时,结果存储的位需要增加 unsigned int j; for(j = 0; j < b.size(); j++) { c += (result[tmp_i] - '0') + (a[i] - '0')*(b[j] - '0'); result[tmp_i++] = (c % 10) + '0'; c /= 10; } while(c)//处理最后进位 { result[tmp_i++] = (c % 10) + '0'; c /= 10; } } for(unsigned int i = result.size() - 1; i >= 0; i--) { if(result[i] != '0') { break; } else { result.erase(result.begin() + i,result.end());//截断后面全0 } } //cout<<result<<endl; reverse(result.begin(),result.end()); cout<<result<<endl;}int main(){ string a,b; cin>>a>>b; reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); multply(a,b); return 0;}
运行结果
0 0
- 大数乘法——逐位与移位算法
- 算法提高 高精度乘法 ————大数乘法
- 大数乘法_移位相乘
- 乘法/除法与移位
- 每周算法练习——大数的乘法问题
- 算法重拾之路——大数乘法
- 2016蓝桥杯算法提高——P1001(大数乘法)
- 大数系列——大数乘法
- 大数运算(4)——大数乘法
- 大数乘法——POJ2389
- 蓝桥杯——算法提高 大数加法&大数乘法&冒泡排序
- 大数加法与乘法
- 傅里叶变换与大数乘法
- 大数加法与乘法
- 算法解析之大数乘法
- [算法题] 大数乘法运算
- KaraTsuba乘法——高效的大数乘法
- KaraTsuba乘法——高效的大数乘法
- QQ侧滑删除功能原理以及冲突解决
- 2、设计模式之二
- 六角填数
- 机器学习中的范数规则化之(一)L0、L1与L2范数
- i++ 和++i的区别
- 大数乘法——逐位与移位算法
- 机器学习中的范数规则化之(二)核范数与规则项参数选择
- 7.1在窗口(宽300,高200)中添加一个面板,面板的背景色为绿色,窗口在屏幕中央,不允许改变其大小,关闭窗口时程序结束运行
- 随便写点。。。
- Regularization
- 尔雅科幻中的物理学答案
- 计算机网络体系结构综述(上)
- 解决eclipse中出现Resource is out of sync with the file system问题
- JS基本类型和引用类型赋值的区别