洛谷P2142 高精度减法 题解
想找原题请点击这里:传送门
原题:
题目描述 高精度减法 输入格式 两个整数a,b(第二个可能比第一个大) 输出格式 结果(是负数要输出负号) 输入输出样例 输入 复制 2 1 输出 复制 1 说明/提示 20%数据a,b在long long范围内 100%数据0 < a,b <10^10086 (此处^为乘方)
再简单讲一下高精度运算的原理。
为什么要产生高精度运算?
由于c++的数据结构非常严谨,然而c++提供的储存数的数据结构只有int和long long,当则两种数据类型进行运算时当储存数据过大都会导致溢出问题。
所以高精度就诞生了!
高精度大概流程:
1.将要进行特定运算的两数以字符串形势储存起来
2.将字符串中储存的数从最低位到最高位(最高的最高位)顺序用int类型存起来
3.进行运算
4.进行每位的进位和最高位更新
5.去掉前导零
那么代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 10087 5 using namespace std; 6 char a[N]; 7 char b[N]; 8 char ta[N]; 9 char ans[N]; 10 int aa[N],bb[N],ansa[N]; 11 int tb; 12 bool flag; 13 int main() 14 { 15 scanf("%s",&a); 16 scanf("%s",&b); 17 int la=strlen(a),lb=strlen(b); 18 if(lb>la) { 19 flag=true; 20 strcpy(ta,a);strcpy(a,b);strcpy(b,ta); 21 tb=la;la=lb;lb=tb; 22 } 23 else{ 24 if(la==lb){ 25 for(int i=0;i<la;i++){ 26 if(a[i]==b[i]){ 27 continue; 28 } 29 if(a[i]>b[i]){ 30 break; 31 } 32 flag=true; 33 strcpy(ta,a);strcpy(a,b);strcpy(b,ta); 34 tb=la;la=lb;lb=tb; 35 break; 36 } 37 } 38 } 39 for(int i=1;i<=la;i++){ 40 aa[i]=a[la-i]-'0'; 41 } 42 for(int i=1;i<=lb;i++){ 43 bb[i]=b[lb-i]-'0'; 44 } 45 int mm=max(la,lb); 46 for(int i=1;i<=mm;i++){ 47 ansa[i]+=(aa[i]-bb[i]); 48 if(ansa[i]<0){ 49 ansa[i]+=10; 50 ansa[i+1]--; 51 } 52 } 53 for(int i=mm;i>=2;i--){ 54 if(ansa[i]){ 55 break; 56 } 57 mm--; 58 } 59 if(flag) printf("-"); 60 for(int i=mm;i>=1;i--){ 61 printf("%d",ansa[i]); 62 } 63 return 0; 64 }