高精度减法跟高精度加法一样,都是超过了(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,b≤1010086
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()))