洛谷 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;
}

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/87703254