高精度减法

高精度减法


题目描述
输入两个正整数,输出第一个数减去第二个数的差,可能是整数,负数或0。

输入
输入文件只有两行,第一行一个整数x,第二行一个整数y。其中0<=x<=10200,0<=y<=10200

输出
输出文件有1行,第一个数减去第二个数的差。

 高精度减法注意两点:

1.大数减小数

2.消除前导0

#include<stdio.h>
#include<string.h>
using namespace std;
char str1[260];
char str2[260];
int d1[260];
int d2[260];
int result[500];
int main()
{
    scanf("%s",str1);
    scanf("%s",str2);
    int length;
    int L1=strlen(str1);
    int L2=strlen(str2);
    length=L1;
    bool fuhao=false;
    if(L1>L2)
    {
        length=L1;
            for(int i=L1-1;i>-1;i--)
        {
            d1[L1-1-i]=str1[i]-'0';
        }
        for(int i=L2-1;i>-1;i--)
        {
            d2[L2-1-i]=str2[i]-'0';
        }
    }
    else if(L1<L2)
    {
        length=L2;
        fuhao=true;
            for(int i=L1-1;i>-1;i--)
        {
            d2[L1-1-i]=str1[i]-'0';
        }
        for(int i=L2-1;i>-1;i--)
        {
            d1[L2-1-i]=str2[i]-'0';
        }
    }
    else
    {
        if(strcmp(str1,str2)>0)
        {
                for(int i=L1-1;i>-1;i--)
            {
                d1[L1-1-i]=str1[i]-'0';
            }
            for(int i=L2-1;i>-1;i--)
            {
                d2[L2-1-i]=str2[i]-'0';
            }
        }
        else if(strcmp(str1,str2)<0)
        {
            fuhao=true;
                    for(int i=L1-1;i>-1;i--)
                {
                    d2[L1-1-i]=str1[i]-'0';
                }
                for(int i=L2-1;i>-1;i--)
                {
                    d1[L2-1-i]=str2[i]-'0';
                }
        }
        else
        {
            printf("0\n");
            return 0;
        }
    } 
    int temp=0;

    
    for(int i=0;i<length;i++)
    {
        
        temp=d1[i]-d2[i];
        if(temp<0)
        {
            temp+=10;
            result[i+1]--;
        } 

        result[i]=temp;
    } 
    if(fuhao)
    printf("-");
    //注意这里消除前导0的方法 使用while循环 同时防止结果只有一位时无输出的情况
    //不消除前导0就是错的
    while(result[length-1]==0&&length>1)
    length--;
    for(int i=length-1;i>-1;i--)
    {
        printf("%d",result[i]); 
    }
    
    return 0;
}

附别人链接

https://blog.csdn.net/qq_42695892/article/details/82530762

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值