洛谷 P2142 高精度减法

https://www.luogu.org/problemnew/show/P2142

题目描述

高精度减法

输入输出格式

输入格式:

 

两个整数a,b(第二个可能比第一个大)

 

输出格式:

 

结果(是负数要输出负号)

 

输入输出样例

输入样例#1: 复制

2
1

输出样例#1: 复制

1

说明

20%数据a,b在long long范围内

100%数据0<a,b<=10的10000次方

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    int a[10010];
    memset(a,0,sizeof(a));
    string s1,s2;
    cin>>s1>>s2;
    if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2))//若s1<s2 先输出负号 再互换s1 s2的值
    {
        cout<<'-';
        swap(s1,s2);
    }
    int i=s1.size()-1,j=s2.size()-1,k=10005;
    int jw=0;
    for(;i>=0&&j>=0;i--,j--,k--)
    {
        int temp=s1[i]-s2[j]-jw;
        if(temp>=0)
        {
            a[k]=temp;
            jw=0;
        }
        else
        {
            a[k]=temp+10;
            jw=1;
        }
    }
    while(i>=0)//s1的位数更多
    {
        if(jw!=0)//还有借位
        {
            a[k]=s1[i]-'0'-jw;
            if(a[k]>=0)
                jw=0;
            else
            {
                a[k]+=10;
                jw=1;
            }
            k--;
            i--;
        }
        else//没有借位
            a[k--]=s1[i--]-'0';
    }
    int t=k;
    while(a[t]==0&&t<=10005)//找到第一个不为0的数
        t++;
    if(t==10006)
        cout<<0;
    for(;t<=10005;t++)
    {
        cout<<a[t];
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值