深入浅出学算法021-高精度求积(MULTIPLY)

  • Post author:
  • Post category:其他




题目描述

输入两个高精度非负整数M和N(M和N均小于100位)。



输入

输入两个高精度非负整数M和N(M和N均小于100位)。



输出

求这两个高精度数的积。



样例输入
36
3


样例输出
108
#include<iostream>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

// 超长整数*个位数 
string small_mul(string s1,int c1){
	if(c1==0) return "0";
	else if(c1==1) return s1;
	
	reverse(s1.begin(),s1.end());
	string sum="";
//	cc表示进位 
	int temp=0,cc=0;
	
	for(int i=0;i<s1.length();i++){
		temp=(s1[i]-'0')*c1+cc;
		cc=temp/10;
		sum+=temp%10+'0';
	}
	if(cc!=0)sum+=cc+'0';
	reverse(sum.begin(),sum.end());
	return sum;
}

string get_sum(string s1,string s2){
	reverse(s1.begin(),s1.end());
	reverse(s2.begin(),s2.end());
	string sum="";
	int temp=0,cc=0;
	
	string maxstr=s1.length()>s2.length()? s1:s2;
	int minlen=s1.length()>s2.length()? s2.length():s1.length();
	
	for(int i=0;i<minlen;i++){
		temp=(s1[i]-'0')+(s2[i]-'0')+cc;
		cc=temp/10;
		sum+=temp%10+'0';
	}
//	考虑两个加数位数不同 
	for(int i=minlen;i<maxstr.length();i++){
		temp=(maxstr[i]-'0')+cc;
		cc=temp/10;
		sum+=temp%10+'0';
	}
//	考虑到最高位仍有进位 
	if(cc!=0)sum+=cc+'0';
	reverse(sum.begin(),sum.end());
	return sum;
}

string big_mul(string s1,string s2){
	reverse(s2.begin(),s2.end());
	int add=0;
	string sum="",tempstr="";
	for(int i=0;i<s2.length();i++){
		tempstr=small_mul(s1,s2[i]-'0');
//		每加一次0,就相当于乘以10,乘法需要依次乘1,10,100,1000... 
		for(int k=0;k<add;k++){
			tempstr+='0';
		}
		sum=get_sum(sum,tempstr);
		add++;
	}
	return sum;
} 




int main(){
	string s1,s2;
	cin>>s1>>s2;
	
	cout<<big_mul(s1,s2)<<endl;
	
}



版权声明:本文为weixin_45852395原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。