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

该代码实现了一个计算两个高精度非负整数乘积的C++程序,通过逐位相乘和进位的方法处理超过常规整数范围的大数乘法问题。
摘要由CSDN通过智能技术生成
题目描述

输入两个高精度非负整数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;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值