[高精度]高精减法

本文详细介绍了如何进行高精度减法操作,首先将字符串转换为倒序的整数数组,然后逐项相减并处理借位,最后去除前导零,如果结果为负数则在输出时加上负号。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <string.h>
char s1[10100];
char s2[10100];
int a[10100];
int b[10100];
int main()
{
    int pp;scanf("%d",&pp);
    while (pp--)
    {
        scanf("%s%s",s1,s2);
        int l1 = strlen(s1);
        int l2 = strlen(s2);
        int flag = 0;

        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));  

        if ( l1 < l2 || (strcmp(s1,s2) < 0 && l1 == l2) )
        {
            flag = 1;
            for (int i = l2 - 1 ; i >= 0 ; i--)
                a[l2 - i - 1] = s2[i] - '0';
            for (int i = l1 - 1 ; i >= 0 ; i--)
                b[l1 - i - 1] = s1[i] - '0';
        }
        else
        {
            for (int i = l1 - 1 ; i >= 0 ; i--)
                a[l1 - i - 1] = s1[i] - '0';
            for (int i = l2 - 1 ; i >= 0 ; i--)
                b[l2 - i - 1] = s2[i] - '0';
        }
        int len;
        if (l1 > l2) 
            len = l1;
        else 
            len = l2;
//      for (int i = 0 ; i <= len ; i++)
//          a[i] = b[i] = 0;
        for (int i = 0 ; i < len ; i++)
        {
            a[i] = a[i] - b[i];
            if (a[i] < 0)
            {
                a[i+1]-=1;
                a[i]+=10;
            }
        }

        while (a[len - 1] == 0 && len>1) len--;

        if (flag == 1) printf("-");
        for (int i = len - 1 ;i >= 0 ;i--)
            printf("%d",a[i]);
        printf("\n");
    }
    return 0;
}

分段解读:
第一段:把字符串转换为整形数组(为了方便运算,倒序写入)
这里的fiag用于标记是否结果负数.并保证a中的数大于等于b

scanf("%s%s",s1,s2);
        int l1 = strlen(s1);
        int l2 = strlen(s2);
        int flag = 0;

        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));  

        if ( l1 < l2 || (strcmp(s1,s2) < 0 && l1 == l2) )
        {
            flag = 1;
            for (int i = l2 - 1 ; i >= 0 ; i--)
                a[l2 - i - 1] = s2[i] - '0';
            for (int i = l1 - 1 ; i >= 0 ; i--)
                b[l1 - i - 1] = s1[i] - '0';
        }
        else
        {
            for (int i = l1 - 1 ; i >= 0 ; i--)
                a[l1 - i - 1] = s1[i] - '0';
            for (int i = l2 - 1 ; i >= 0 ; i--)
                b[l2 - i - 1] = s2[i] - '0';
        }

第二段:把A和B中逐项相减.如果小于0则借位;

for (int i = 0 ; i < len ; i++)
        {
            a[i] = a[i] - b[i];
            if (a[i] < 0)
            {
                a[i+1]-=1;
                a[i]+=10;
            }
        }

第三段:while去首0

while (a[len - 1] == 0 && len>1) len--;

最后输出,如果有flag则输出’-‘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值