高精度减法与高精度加法

高精度加法

高精度的加法只有三步

1,以字符的形式输入

2,倒序转数字

3,数组加减与进位

#include<bits/stdc++.h>
using namespace std;
int a[510],b[510],c[510];
char a1[510],b1[510];
int main()
{
	cin>>a1>>b1;
	for(int i=strlen(a1)-1,j=0;i>=0;i--,j++)
	{
		a[j]=a1[i]-'0';
	}
	for(int i=strlen(b1)-1,j=0;i>=0;i--,j++)
	{
		b[j]=b1[i]-'0';
	}
	int tot=max(strlen(a1),strlen(b1));
	for(int j=0;j<tot;j++)
	{
		c[j]+=(a[j]+b[j]);
		if(c[j]>9)
		{
			c[j+1]+=c[j]/10;
			c[j]%=10;
		}
	}	
	if(c[tot]!=0) tot++;
	for(int i=tot-1;i>=0;i--)
		cout<<c[i];
	return 0;
}

高精度减法

高精度减法相对麻烦,需要判断两值的大小

其他的操作与加法相似

#include<bits/stdc++.h>
using namespace std;
int a[11000],b[11000],c[11000];
char a1[11000],b1[11000];
int main()
{
	cin>>a1>>b1;//直接输入两个数
	for(int i=strlen(a1)-1,j=0;i>=0;i--,j++)
		a[j]=a1[i]-'0';
	for(int i=strlen(b1)-1,j=0;i>=0;i--,j++)//将两个字符转化为数组族中的独立元素
		b[j]=b1[i]-'0';
	int tot=max(strlen(a1),strlen(b1));//记录两数的最大长度
	int op=2;//初始默认操作2(即a>b)
	if(strlen(b1)>strlen(a1))//通过长度判断a b的大小
	{
		for(int i=0;i<tot;i++)
			swap(a[i],b[i]);
		op=1;//将操作判别数更改为1
	}
	else if(strlen(a1)==strlen(b1))
	{
		for(int i=tot-1;i>=0;i--)//如果a b的长度一样,则判断高位的大小
		{
			if(a[i]==b[i]){ 
			continue;
			}
			if(a[i]>b[i]) break;//证明a>b
			if(a[i]<b[i])
			{
				for(int j=0;j<tot;j++)
					swap(a[j],b[j]);
				op=1;
				break;
			}
		}
	}
	else op=2;
	for(int i=0;i<tot;i++)
	{
		if(a[i]-b[i]<0)//借位
		{
			c[i]=a[i]+10-b[i];
			a[i+1]--;
		}
		else c[i]=a[i]-b[i];
	}
	for(int i=tot-1;i>=0;i--)
	{   
		if(c[i]==0)
		{
			if(i==0) break;
			else tot--;//删除前位的零
		}
		else break;
	}
	if(op==1) cout<<"-";
	for(int i=tot-1;i>=0;i--)
		cout<<c[i];
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值