题解5:高精度减法

11 篇文章 0 订阅

在这里插入图片描述
基本思路:对于给定的两个数值,把其当成字符串,进一步转化成整型,逆序存放在整型数组中,对其每一个位进行相减,但是要注意借位的使用,最后为了保险在设置一个循环,把前置0去掉,最后输出结果。
AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#define N 100010
using namespace std;
int main()
{
    char sa[N], sb[N];//输入的两个数 
    scanf("%s",&sa);
	scanf("%s",&sb); 
    int a[N]={0}, b[N]={0},c[N]={0};//定义用作转化成整型存放的数组 
    int la,lb,i,t=0;
	la=strlen(sa);//计算长度 
	lb=strlen(sb);//计算长度
    for(i = la-1; i >= 0; i--)
		a[la-i-1]=sa[i]-'0';//把第一个数逆序存放到整型数组中 
    for(i = lb-1; i >= 0; i--)
		b[lb-i-1]=sb[i]-'0';//把第二个数逆序存放到整型数组中 
	while(a[la-1]==  0 )
	la- - ;//如果有0的话,就去掉 
	while(b[lb-1]== 0)
	lb- -;
	int max=la;
	if(max<lb)
		max=lb;//求最大长度 
	if (strcmp(sa,sb)== 0)//相等时 
	{
		printf("0"); 
		return 0; 
	}
	else if (la<lb||(la == lb&&strcmp(sa,sb)==-1))//当被减数大于减数的时候进行交换,并输出'-'号 
	{
		for(i=0;i<lb;i++)
		{
			t=a[i];
			a[i]=b[i];
			b[i]=t;
		}
		printf("-"); 
	}
	for(i=0;i<max;i++)//对于每一个小单位进行减法运算 
	{
		if(a[i]<b[i])//判断对应的值谁大谁小 
		{
			a[i]=a[i]+10;
			a[i+1]--;//借位的使用
		}
		c[i]=a[i]-b[i];//把结果存放到 一个新的数组中 
	} 
	for(;i>=0;i--)
		if(c[i]!=0)
			break;//去掉结果前面的0 
    for(;i>=0;i--)
		printf("%d",c[i]);//输出结果 
    return 0;
}

注意:
1.借位要熟练其规则
2.涉及到负数和0比较麻烦,需要对其进行限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值