大数运算(四)——大数相乘
来源:互联网 发布:用指针给数组排序3个数 编辑:程序博客网 时间:2024/05/21 11:18
给定任意长度的数字,数字长度从1到1000位,求两个数字的乘积。
可以用字符串来保存超长数字。
解题思路:
利用乘法公式,将被乘数与乘数的每一位相乘,在乘完一位数后,要注意移位,即在被乘数后面补零。然后将被乘数与乘数每一位相乘的结果相加。
#include<iostream>#include<string>using namespace std;string BigAdd(string a,string b){ string s1,s2; int i,len1,len2; if(a.size()>=b.size()) { s1=a; s2=b; } else { s1=b; s2=a; } len1=s1.size(); len2=s2.size(); for(i=len2-1;i>=0;i--) s1[len1-1-i]=s1[len1-1-i]+s2[len2-1-i]-'0'; for(i=len1-1;i>0;i--) { //cout<<s1[i]; while(s1[i]>'9') { s1[i]-=10; s1[i-1]++; } } if(s1[0]>'9') { s1[0]-=10; s1.insert(s1.begin(),'1'); } //cout<<s1<<endl; return s1;}void BigMulti(string a,string b){ int len1,len2; len1=a.size(); len2=b.size(); int n1,n2,flag=0; string result="0",temp; for(int i=len2-1; i>=0; i--) //或者当a.size()<b.size()时交换a,b { n2=b[i]-'0'; temp=a+string(len2-1-i,'0'); //cout<<temp<<endl; for(int j=len1-1; j>=0; j--) { n1=a[j]-'0'; //temp[j]=n1*n2+'0'; if(n1*n2+'0'>127) //防止越界 { //temp[j]=n1*n2+'0'-10; temp[j]=n1*n2%10+'0'+flag; flag=n1*n2/10; } else { temp[j]=n1*n2%10+'0'+flag; flag=n1*n2/10; } //cout<<temp<<endl; } //cout<<temp<<endl; if(flag) { char c=flag+'0'; temp.insert(temp.begin(),c); flag=0; //本轮循环结束后归零 } result=BigAdd(temp,result); //temp的值比result大 } cout<<result<<endl;}int main(){ string str1,str2; while(cin>>str1>>str2) BigMulti(str1,str2); return 0;}
程序运行结果:
0 0
- 大数运算(四)——大数相乘
- 大数运算 (四)—— 大数阶乘
- 大数运算(四)
- 模板——大数相乘
- 大数相乘(小数点)
- 大数相乘(java)
- Product(大数相乘)
- 大数相乘(java)
- (转)大数相乘
- (盗版)大数相乘
- 大数相乘(高精度)
- 大数运算(二) —— 大数加法
- 大数运算(二)——大数相减
- 大数运算(1)——大数储存
- 大数运算(3)——大数减法
- 大数运算(2)——大数加法
- 大数运算(4)——大数乘法
- 大数相乘——分治法(lua版)
- UVa 1025:A Spy in the Metro(DP)
- ios开发之状态栏隐藏
- RevitAPI: 如何使用API创建墙饰条
- 今天碰到一个骗子
- Android studio中使用fastjson
- 大数运算(四)——大数相乘
- UVALive 6656 Watching the Kangaroo(二分)
- linux device常用的管理机制
- 拉格朗日求条件极值
- 湖心亭看雪
- ACM大数相减
- iOS开发:如何给UIViewController瘦身
- MFC六大关键技术
- 【学习日记】java网络编程知识点总结