高精度加法和减法的编程实现


无论是加法还是减法,读入的两个数都是正整数,计算的结果保存到数组中。


对于数据的读取,可以是字符串,也可以是整数。


对于计算结果,我这里不超过80位(可以修改)

两个数相加的程序为:

<span style="font-size:18px;"><span style="font-size:18px;">#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int and[80]={0};
int main(){
	string a,b;
	int aa[80]={0},bb[80]={0};
	int n;
	cin>>n;
	while(n--){
		cin>>a>>b;
			for(int i=0;i<a.size();i++ ){
				aa[i]=(int)(a[a.size()-1-i]-'0');
			}
				for(int j=0;j<b.size();j++){
					bb[j]=(int)(b[b.size()-1-j]-'0');
				}
				int l=_MAX(a.size(),b.size() ;
				for(int h=0;h<l;h++){
					and[h]=aa[h]+bb[h]+and[h];
					and[h+1]=(and[h])/10;
					and[h]=and[h]%10;
				}
				memset(aa,0,sizeof(aa) );
				memset(bb,0,sizeof(bb) );
	int m=79;
	while(and[m]==0){
		m--;
	}
	for(;m>=0;m--)
		cout<<and[m];
	cout<<endl;
	memset(and,0,sizeof(and));
	}
	return 0;
}</span></span>

两个数做减法,大数减去小数可以直接输出结果,小数减去大数,需要修正符号位,然后输出

减法程序如下:

<span style="font-size:18px;"><span style="font-size:18px;">#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int compare(int[],int[]);
int and[80]={0};
int main(){
	string a,b;
	int aa[80]={0},bb[80]={0};
	int n,flag;
	cin>>n;
	while(n--){
		cin>>a>>b;
			for(int i=0;i<a.size();i++ ){
				aa[i]=(int)(a[a.size()-1-i]-'0');
			}
				for(int j=0;j<b.size();j++){
					bb[j]=(int)(b[b.size()-1-j]-'0');
				}
	           int l=_MAX(a.size(),b.size() );
			   flag=compare(aa,bb);
			   if(flag==0)
				   cout<<"0"<<endl;
			   else if(flag==1){
				   for(int h=0;h<l;h++){
					   if((aa[h]-bb[h])<0){
						   aa[h+1]=aa[h+1]-1;
						   aa[h]=aa[h]+10;
					   }
					   and[h]=aa[h]-bb[h];
				   }
			   }
			   else if(flag==-1){
				   for(int h=0;h<l;h++){
					   if((bb[h]-aa[h])<0){
						   bb[h+1]=bb[h+1]-1;
						   bb[h]=bb[h]+10;
					   }
					   and[h]=bb[h]-aa[h];
				   }
			   }
			   int m=79;
			   if(flag==0)
				   return 0;
			   else{
				   while(and[m]==0)
					   m--;
				   if(flag==-1)
					   cout<<"-";
				   for(;m>=0;m--)
					   cout<<and[m];
				   cout<<endl;
			   }
			   memset(and,0,sizeof(and) );
			   memset(aa,0,sizeof(aa) );
			   memset(bb,0,sizeof(bb) );
	}
	return 0;
}
int compare(int a[80],int b[80]){
	int i=79,j=79;
	while(a[i]==0)
		i--;
	while(b[j]==0)
		j--;
	if(i>j)
		return 1;
	if(i<j)
		return -1;
	if(i==j){
		for(int h=j;h>=0;h--){
			if(a[h]>b[h])
				return 1;
			if(a[h]<b[h])
				return -1;
		}
	}
	return 0;
}</span></span>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值