大数乘法
来源:互联网 发布:地理信息数据加工基地 编辑:程序博客网 时间:2024/06/07 20:43
这次是接着上次的大数加减写的大数乘法。
乘法的判断有些复杂。有以下几种情况。
1. a或者b为0
2. a或者b是负数
3. a和b都是负数
因此在做乘法之前先对他们的符号做一个判断,我这里采取的是截取子串的以及标志的方法来处理。
if(a[0]=='0' || b[0]=='0'){ sum.push_back('0'); return sum; } //判断符号 if(a[0]=='-'||b[0]=='-'){ flag=1; if(a[0]=='-'&&b[0]=='-') flag=0; if(a[0]=='-') a=a.substr(1,a.size()-1); if(b[0]=='-') b=b.substr(1,b.size()-1); }
然后来说说大数乘法的思路。
以1234*56为例
翻转数字后是
4 3 2 1
6 5
6和每一位数相乘得到(24,18,12,6)
5和每一位数相乘得到( ,20,15,10,5)
我这样分开写的原因是模拟竖式乘法。
按相同位上的数相加可以得到(24,38,27,16,5)
现在就是一个取余进位的处理了。
(4,0,1,9,6)
所以最后的结果应该是69104。
根据以上思路写出如下代码。
int num1,num2; for(int i=0;i<a.size();i++){ for(int j=0;j<b.size();j++){ num1=a[i]-'0'; num2=b[j]-'0'; result[i+j]+=num1*num2; } }
这里当然还可以改进一下。。至于为什么是存进[i+j]里呢,这里是为了符合对应位的相加。。
我这里用了一个vector来存放数字。
接着就是将数字转化为字符处理。以及进位。
for(int i=0;i<result.size();i++){ if(result[i]>=10){ result[i+1]+=result[i]/10; result[i]%=10; } sum.push_back(result[i]+'0');
接着就是要处理前导0的问题。。反转之后,用我上次在大数加减法所提到的截取子串去掉前导0的方法即可。
完整的代码如下:
#include<cstdio>#include<iostream>#include<string>#include<algorithm>#include<vector>using namespace std;string multiply(string a,string b){ string sum; int flag=0; vector <int> result(a.size()+b.size(),0); //判断0 if(a[0]=='0' || b[0]=='0'){ sum.push_back('0'); return sum; } //判断符号 if(a[0]=='-'||b[0]=='-'){ flag=1; if(a[0]=='-'&&b[0]=='-') flag=0; if(a[0]=='-') a=a.substr(1,a.size()-1); if(b[0]=='-') b=b.substr(1,b.size()-1); } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); int num1,num2; for(int i=0;i<a.size();i++){ for(int j=0;j<b.size();j++){ num1=a[i]-'0'; num2=b[j]-'0'; result[i+j]+=num1*num2; } } for(int i=0;i<result.size();i++){ if(result[i]>=10){ result[i+1]+=result[i]/10; result[i]%=10; } sum.push_back(result[i]+'0'); } reverse(sum.begin(),sum.end()); int ind=-1; while(sum[++ind]=='0'); if(ind!=-1) sum=sum.substr(ind); if(flag){ cout<<'-'; } return sum;}int main(){ string a,b; while(cin>>a>>b){ cout<<multiply(a,b)<<endl; } return 0;}
当然还有更优化的办法。这里也是为了巩固才学的vector所以试着这样去写一写啦。。。如果有错或者什么更棒的方法,也希望大家指出啊。QWQ
0 0
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- 大数乘法
- javascript脚本放在 <body>元素的底部的好处
- android GestureDetector依赖onTouchEvent判断左右滑动
- Android实现EditText输入监听的方法
- android GestureDetector学习
- android getSystemService(系统服务)学习
- 大数乘法
- 获取当前正在显示activity的包名
- android DisplayMetrics学习
- Weblogic启动报错NumberFormatException的解决方法
- 【2017/4/11】centos6.5下安装oracle10.2.0.5软件
- android 自定义适配器Adapter基类BaseAdapter
- android APK打包过程学习
- android RelativeLayout 属性学习
- 把安装包拖拽到模拟器genymotion时报错的原因及解决办法