进阶#高精度加减法

高精度加减法,就是是你的程序能计算非常大的一些加减法。下面我们来了解一下这种加减法的实现过程.

加法:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
    string a,b;
    int m,n,maxn,f=0,i;
    cin>>a>>b;//以字符串形式输入两个大到离谱的数
    m=strlen(a);//定义字符串长度
    n=strlen(b);
    maxn=max(m,n);//找到数位更多的数保证能运行足够的次数
    int as[max],bs[max],sum[max];
    for(i=0;i<max;i++){
        as[i]=0;//先清个零,不然不能保证所有数位被填满(在数位不同的情况下)
        bs[i]=0;
    }
    for(i=0;i<m;i++){
        as[i]=(int)(a[m-i-1]-'0');//反向存储每一位数字,把他们转化成int形式
    }
    for(i=0;i<n;i++){
        bs[i]=(int)(b[n-i-1]-'0');
    }
    for(i=0;i<max;i++){
        sum[i]=as[i]+bs[i]+f;//开始加,每一位的和=两个数这一位的和加上进位
        f=sum[i]/10;//判断进位
        sum[i]=sum[i]%10;//求出进位后的数位数字
    }
    if(f==1){
        cout<<f;//要是首位进位的话就先输出首位进位
    } 
    for(i=max-1;i>=0;i--){
        cout<<sum[i];//输出
    }
}

减法和加法差不多,只是进位变为退位

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
char n1[9999],n2[9999],n3[9999];
int z[99][99]={0};
int s1[9999]={0},s2[9999]={0},s3[9999]={0};
int main()
{
	int i=0,l,nx,ny,tw=0,ti=0,ti2=0;
	cin>>n1>>n2;
	nx=strlen(n1);
	ny=strlen(n2);
	int y=max(nx,ny);
	if(nx<ny||(strcmp(n1,n2)<0&&nx==ny))//处理负数问题
	{
		strcpy(n3,n1);
		strcpy(n1,n2);
		strcpy(n2,n3);//换位 
		swap(nx,ny);
		cout<<"-";//输出负号
	}
	for(i=0;i<nx;i++)
	{
		s1[i]=n1[nx-1-i]-'0';//倒序输入一个数		
	}
	for(i=0;i<ny;i++)
	{
		s2[i]=n2[ny-1-i]-'0';//另一个数 
	}
    for(i=0;i<y;i++)
    {
	    s1[i]=s1[i]-s2[i];
    	if(s1[i]<0)
    	{
    		s1[i]+=10;
    		s1[i+1]--;//退位处理 
		}
		
	}
	i=y-1;//x新的输出方法,可以省略前面的0.
	while(s1[i]==0) i--;
	for(;i>=0;i--) cout<<s1[i];
}

Seele不是水文章,Seele只是萌新的搬运工

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值