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

猜你喜欢

转载自www.cnblogs.com/robertspot/p/12375979.html