高精度计算

目录

1、高精度加法

2.高精度减法

3、高精度乘法

4、高精度除法


思路:

1、将字符串逆序

2、较短的字符串补0

3、再判断是否要进位

1、高精度加法

法一:

#include<iostream>
using namespace std;

string str1,str2;
int n1[300],n2[300],n3[300],len;

void f(){
	for(int i=0;i<len;i++){
		n3[i]+=n1[i]+n2[i];  //相同位置相加,并加上上一位的进位 
		n3[i+1]=n3[i]/10;  //进位 
		n3[i]%=10;   //进完位后,取余 
	}
	if(n3[len]){
		cout<<n3[len];  //最高位len的下一位,有没有被进位 
	}
	for(int i=len-1;i>=0;i--){//逆序输出 
		cout<<n3[i];
	}
}

int main(){
	cin>>str1>>str2; //输出连个数字字符串 
	int t=str1.length()-1;  //str1的高位下标 
	for(int i=0;i<str1.length();i++){  //逆序
		n1[i]=str1[t]-'0';  //并把字符转数字 
		t--;
	}
	t=str2.length()-1;//str2的高位下标 
	for(int i=0;i<str2.length();i++){//逆序
		n2[i]=str2[t]-'0'; //并把字符转数字
		t--;
	}
	if(str1.length()>=str2.length()){  //str1比较长 
		len=str1.length();  //记录最长的长度 
		f(); 
	}else{  //str2比较长 
		len=str2.length();
		f();//调用函数,长加短 
	}
} 

 法二:

#include<iostream>
#include<algorithm>
using namespace std;


//加法
string add(string a,string b){
	string ans; //结果 
	int len=max(a.size(),b.size());
	reverse(a.begin(),a.end());  //翻转 
	reverse(b.begin(),b.end()); //翻转
	for(int i=a.size();i<len;i++)a=a+'0';
	for(int i=b.size();i<len;i++)b=b+'0';
	int x=0;//用于进位
	for(int i=0;i<len;i++){
		x=x+(a[i]-'0')+(b[i]-'0');
		ans+=x%10+'0';
		x=x/10;
	}
	if(x>0)ans+='1';
	reverse(ans.begin(),ans.end());
	return ans;
} 



int main(){
	string a,b; 
	cin>>a>>b;
	cout<<add(a,b);
	
} 

2.高精度减法

①两个都是正整数:

#include<bits/stdc++.h> 
using namespace std;
string n,m;

//大数  减小
string add(string a,string b){
	string ans; 
	int x=0;
	//先对位 颠倒字符串顺序 
	reverse(a.begin(),a.end());   
	reverse(b.begin(),b.end());
	//补 0    这两个加数可能位数不同
	int len=max(a.size(),b.size());
	for(int i=a.size();i<len;i++)a=a+'0';  
	for(int i=b.size();i<len;i++)b=b+'0';

	//核心内容  模拟竖式运算 
	for(int i=0;i<len;i++){
		a[i+1]-=1; //不管够不够都借一位 
		x=x + (a[i]-'0') - (b[i]-'0') + 10;  
		ans+=x%10+'0'; //拼接 
		x=x/10;
	}
	reverse(ans.begin(),ans.end());
	while(ans[0]=='0'&&len>1)ans.erase(ans.begin()),len--;//去前置 0
	//加法  就要考虑最后一个进位  
	//减法  就要考虑最后删掉前置 0 
	return ans;
}
int main(){
	cin>>n>>m; 
	if(n.length()>=m.length()){  //n较大 
		cout<<add(n,m); 
	}else{
		cout<<"-"<<add(m,n);  //m较大,要加负数 
	}
	return 0; 
}
  1. 3、高精度乘法

  2. #include<bits/stdc++.h> 
    using namespace std;
    string mul(string a,string b){
    	int c[10001]= {};//为了方便记录过程的结果 
    	string ans;//最后输出的答案
    	//模拟竖式乘法的过程,从低位开始相乘,所以要将两个数倒置
    	reverse(a.begin(),a.end()); 
    	reverse(b.begin(),b.end());
    	//因为一共需要计算 a.size()*b.size()次;所以需要循环嵌套遍历每一个数 
    	for(int i = 0; i < a.size(); i++)
    		for(int j = 0 ; j < b.size(); j++){
    		//然后是关键的模拟竖式运算的过程,错位相加,以及进位
     
    			c[i+j] += (a[i]-'0')*(b[j]-'0');//直接对应位数相乘 
    			c[i+j+1] += c[i+j]/10;//有无进位
    			c[i+j] %= 10;//保留当前个位数 
    		}
    	//两个非零因数相乘,积的位数要么是两个因数位数之和(如 9*9), 
    	//要么是两个因数位数之和-1(如 9*1)
    	int len=a.size()+b.size();
    	//检查最高位是否为 0 ,如果为 0 ,退一位,
    	//while 循环可以保证即使因数是 0 也能输出正确的结果而不输出多余前导 0 
    	while(c[len]==0&&len>0)len--;
    	for(int i = len; i>=0; i--)ans+=c[i]+'0'; 
    		return ans;
    }
    
    int main(){
    	string s1,s2;
    	cin>>s1>>s2;
    	cout<<mul(s1,s2); 
    	return 0;
    }
    
    

  3. 4、高精度除法

  4. 高精度÷低精度

  5. #include<iostream>
    using namespace std;
    
    string a;
    int b; 
    
    string chu(string a,int b){
    	string ans;
    	int k=0;
    	for(int i=0;i<=a.size()-1;i++){
    		ans+=(k*10+a[i]-'0')/b+'0';
    		k=(k*10+a[i]-'0')%b;
    	}
    	while(ans[0]=='0'&&ans.size()>1){ //去零
    		ans.erase(ans.begin());
    	}
    	return ans;
    }
    int main(){
    	cin>>a>>b;
    	cout<<chu(a,b);
        
    }
    
    

  6. 高精度÷高精度

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    
    //加法
    string add(string a,string b){
    	string ans; //结果 
    	int len=max(a.size(),b.size());
    	reverse(a.begin(),a.end());  //翻转 
    	reverse(b.begin(),b.end()); //翻转
    	for(int i=a.size();i<len;i++)a=a+'0';
    	for(int i=b.size();i<len;i++)b=b+'0';
    	int x=0;//用于进位
    	for(int i=0;i<len;i++){
    		x=x+(a[i]-'0')+(b[i]-'0');
    		ans+=x%10+'0';
    		x=x/10;
    	}
    	if(x>0)ans+='1';
    	reverse(ans.begin(),ans.end());
    	return ans;
    } 
    
    //减法
    string sub(string a,string b){
    	string ans; //结果 
    	int len=max(a.size(),b.size());
    	reverse(a.begin(),a.end()); //翻转
    	reverse(b.begin(),b.end()); //翻转
    	for(int i=a.size();i<len;i++)a=a+'0'; //补零  
    	for(int i=b.size();i<len;i++)b=b+'0';
    	int x=0;//用于进位
    	for(int i=0;i<len;i++){
    		x=x+a[i]-b[i]+10;  //+10:借位 
    		ans+=x%10+'0';
    		x=x/10-1; //还一位 
    	}
    	reverse(ans.begin(),ans.end());
    	while(ans.size()>1&&ans[0]=='0')ans.erase(ans.begin()); 
    	return ans;
    }
    
    //大数比较 
    bool bj(string a, string b){
    	if(a.size() > b.size()){
    		return 1;
    	}else if(a.size() < b.size()){
    		return 0;
    	}else{
    		if(a>=b) return 1;
    		return 0;
    	}
    	
    	
    }
    
    //高精度除法 
    string chu2(string a,string b){
    	string ans;
    	while(bj(a,b)==1){
    		string  b1=b,bei="1",t,k; //b1翻倍后的除数   bei翻了几倍 
    		while(bj(a,b1)){
    			//翻倍前 
    			t=b1; 
    			k=bei;
    			//翻倍 
    			b1=add(b1,b1); 
    			bei=add(bei,bei);
    		}
    		a=sub(a,t); //减 
    		ans=add(ans,k);//加 
    	}
    	return ans; 
    }
    
    int main(){
    	string a,b; 
    	cin>>a>>b;
    	cout<<chu2(a,b);
    	
    } 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值