大整数减法(高精度减法)

高精度减法跟高精度加法一样,都是超过了(long long)的范围,也要转化为字符串来处理:

题目链接:https://www.luogu.org/problem/P2142

高精度减法

输入格式

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

输出格式

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

输入输出样例

输入 #1
2
1
输出 #1
1

说明/提示

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

100%数据0 < a,b \leq 10^{10086}0<a,b1010086

C++代码:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
        string a;
        string b;
        cin>>a;
        cin>>b;
        bool flag=false;//用来判断是否交换了a和b的值 
        if(a==b) cout<<"0";//特判a和b相等 
       int A[100000]={0},B[100000]={0},C[100000]={0}; //A用来存a中的每一个数 。。。。C用来存a和b的每一位数相减的结果 
       int alen=a.length();
       int blen=b.length();
       if(alen<blen) 
       {
            swap(a,b);//如果b的长度大于a的长度,交换a,b的值 
            flag=true;
       }
       else if(alen==blen)
       {
             if(b>a)//如果a和b的长度相等,但b比a大,交换a,b的值; 
             {
              swap(a,b);
                 flag=true;
             }
       }
        alen=a.length();
        blen=b.length();
       for(int i=0;i<=alen;i++)//逆序存入a 
           A[alen-i]=a[i]-'0';
       for(int j=0;j<=blen;j++)//逆序存入b 
           B[blen-j]=b[j]-'0';
        int clen=1;//记录c的长度 
       while(clen<=alen)
       {
             C[clen]=A[clen]-B[clen];//相减 
             if(C[clen]<0) //考虑相减之后小于0; 
             {
                  while(C[clen]<0)
                  {
                   C[clen]+=10;//向上一位借位直到大于0 
                        A[clen+1]--; 
                      }
             }
           clen++;
       }
       while(C[clen]==0)//找到前缀为0的位置 
         clen--;
        if(flag==true) cout<<"-";//判断a和b是否交换过位置;交换过就先输出一个负号 
        for(int t=clen;t>0;t--)
           cout<<C[t];
    return 0;
}

Python代码:

print(int(input())-int(input()))

 

posted @ 2019-08-17 16:07  香格里拉太子zo  阅读(505)  评论(0编辑  收藏  举报