快速提升代码能力(5)大数乘法string初始化

本文介绍了两种不同的大数乘法算法实现方法。第一种方法通过逐位相乘并累加的方式进行,处理了进位操作;第二种方法采用字符串初始化,并通过循环遍历实现了高效的乘法运算。这两种方法均可用于解决超出标准整型变量表示范围的大数乘法问题。

从零起步看算法(第五天 4.10)

//q7 A*B

本题重点:大数乘法

1.一开始以为和大数加法相似,最后发现有很多不同,就当练习大数加法了。

#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream> 
#include<assert.h>
#include<cmath>
#include<algorithm>
using namespace std;
char sum[100000+5];

void mul(string s1,string s2,int len1,int len2){
	
	int len=0;//长度 
	int p=0;//进位 
	
	for(;len1>0||len2>0;len1--,len2--){
		
		if(len1>0&&len2>0){
			sum[len]=(((s1[len1]-'0')*(s2[len2]-'0')+p)%10)+'0';
			p=(((s1[len1]-'0')*(s2[len2]-'0')+p)/10);
		}
		
		else if(len1<=0){
			sum[len]=(((s2[len2]-'0')+p)%10)+'0';
			p=((s2[len2]-'0')+p)/10;
		}
		
		
		else{
			sum[len]=(((s1[len1]-'0')+p)%10)+'0';
			p=((s1[len1]-'0')+p)/10;
		}
		len++;
	}
	
	if(p>0)
	cout<<p+'0';
	for(int i=len-1;i>=0;i--){//末尾下标 
		cout<<sum[i];
	}
	
}
int main(){
	string s1,s2;
	cin>>s1;
	cin>>s2;
	int len1=s1.size();
	int len2=s2.size();
	mul(s1,s2,len1,len2);
	cout<<endl;
	
	return 0;
} 

2.学习优秀代码

(1).string s(s1+s2,'0');//string初始化

(2).s=s.substr(1.s.size()); //在串s中从位置为1,取到位置为s.size();

  (3).i*j      则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)

#include<stdio.h>
#include<string>
#include<cstring>
#include<iostream> 
#include<assert.h>
#include<cmath>
#include<algorithm>
 using namespace std;  
 string BigNumMultiply(string str1,string str2)  
 {  
 int size1=str1.size(),size2=str2.size();  
 string str(size1+size2,'0');  
  for(int i=size2-1;i>=0;--i)  
{  
 int mulflag=0,addflag=0;  
 for(int j=size1-1;j>=0;--j)  
 {  
 int temp1=(str2[i]-'0')*(str1[j]-'0')+mulflag;  
 mulflag=temp1/10;  
 temp1=temp1%10;  
 int temp2=str[i+j+1]-'0'+temp1+addflag;  
 str[i+j+1]=temp2%10+48;  
addflag=temp2/10;  
}  
 str[i]+=mulflag+addflag;  
 }  
if(str[0]=='0')  
 str=str.substr(1,str.size());  
 return str;  
 }  
   
 int main()  
 {  
 string str1,str2;  

 while(cin>>str1>>str2)  
 {  
 if((str1[0]-'0')==0||(str2[0]-'0')==0) 
cout<<0<<endl;
 //cout<<str1<<"*"<<str2<<"="<<endl;  
else
 cout<<BigNumMultiply(str1,str2)<<endl;  
 }  
 return 0;  
 }  

3.最后贴上自己的代码

先加减,再进位的操作。

 #include<stdio.h>
#include<string>
#include<cstring>
#include<iostream> 
#include<assert.h>
#include<cmath>
#include<algorithm>
 using namespace std;
 string mul(string s1,string s2,int len1,int len2){
 	//先处理加法问题,再考虑进位问题 
 	string s(len1+len2,'0');
 	
 	for(int i=len1-1;i>=0;--i){
 		int adf=0;//加法进位 
 		int muf=0;//乘法进位 
 		
 		
 		
 		for(int j=len2-1;j>=0;--j){
 			
 			
 			
 			int temp1=(s1[i]-'0')*(s2[j]-'0')+muf;
 			muf=temp1/10;//进位 
 			temp1=temp1%10;//余数
			 
			 
			 
			 int temp2=s[i+j+1]-'0'+temp1+adf;//总数加减 
			 adf=temp2/10;
			 s[i+j+1]=temp2%10+'0';
 			
		 }
		 s[i]+=adf+muf;//进位 
	 }
	 if(s[0]==0)
	 s=s.substr(1,s.size()) ;
	 return s;
 } 
 
 int main(){
	string s1,s2;
	while(cin>>s1>>s2)
{

	int len1=s1.size();
	int len2=s2.size();
	if((s1[0]-'0'==0)||(s2[0]-'0'==0)){
		cout<<0<<endl;
	}
	else
	cout<<mul(s1,s2,len1,len2)<<endl;
	
}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值