高精度减法 (C++)

题目描述:

输入两个大整数a,b,输出他们的差。(1<=a,b<=10^100)

输入格式:

两个大非负整数a,b。(1<=a,b<=10^100)

输出格式:

输出a减b的差。

输入样例:

35 45

输出样例: 

-10


分析: 

这道题依然是高精度,如果你会做高精度加法,那这题会变得很简单,不会也没关系,听作者慢慢分析。

首先,仍然是令人头疼输入问题,用字符串型输入就行了,然后是怎么做减法,举个例子:111-19

                                                       1 1 1

                                                  -       1 9  

                                                          9 2

但输入进来的是:

               1 1 1 

               1 9

那么我们在char转入int数组时倒着存就好了。

做减法解决了,输出上有个问题,那就是a-b可能是负数,既然是负数那就要有‘- ’号在前面,那么我们用一个bool类型的变量flag对差是否为负数进行判断,当flag==1时代表差是正数,当flag==0时就是负数。

那就开始写代码吧!


代码:

不准直接抄

#include <bits/stdc++.h>
using namespace std;
char ta[10100],tb[10100];
int la,lb,lc;
int a[10100],b[10100],c[10100];//a,b是转换时用的,c是存差的 
int main(){
	cin>>ta>>tb;
	int la=strlen(ta); 
	int lb=strlen(tb);//求字符串长度 
	for(int i=0;i<la;i++)
		a[i+1] =ta[la-1-i]-'0'; 
	for (int i=0;i<lb;i++)
		b[i+1] =tb[lb-1-i]-'0';
	int lc=0,flag=1; 
	if(la>lb)	flag=1;
	else if(la<lb)	flag=0;//如果长度上已近有差距了,赋值 
	else//长度一样的情况下 
	{
		for(int i=0;i<la;i++)
		{
			if(ta[i]<tb[i])
			{
				flag=0;
				break;
			}
			else
			{
				flag=1;
				break;
			}
		}
	}
	if(la>lb) lc=la;
	else lc=lb;//对差的长度进行赋值 
	if(flag==1)
	{
  		for(int i=1;i<=lc;i++)
  		{
  			c[i]+=a[i]-b[i];
  			if(c[i]<0)//进行减法 
			{
				c[i+1]--;
				c[i] += 10;//借位操作 
			}
		}
	}else
	{
		cout<<"-"; 
		for(int i=1;i<=lc;i++) 
		{
			c[i] += b[i]-a[i]; 
  			if(c[i]<0)
			{  
				c[i+1]--;  
				c[i]+=10; 
 			}
		}
	}
	while(c[lc]==0&&lc>1) lc--; 
	for(int i=lc;i>=1;i--)//倒着转换的就要倒着输出 
		cout<<c[i];
	return 0;
}

验证方法:洛谷P2142 高精度减法,直接交,能AC

你学会了吗?

有问题可以在评论区讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值