洛谷 P2142 高精度减法 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2142 高精度减法 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接 :https://www.luogu.org/problem/show?pid=1581

题目描述

高精度减法

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
2
1
输出样例#1:
1

说明

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

100%数据0<a,b<=10的10000次方

 

AC代码:

  1 #include<algorithm>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<iostream>
  5 
  6 using namespace std;
  7 const int MAXN = 10000 + 5;
  8 
  9 struct bign
 10 {
 11     int len;
 12     bool flag;
 13     int num[MAXN];
 14     
 15     bign(){len = 0;flag = false;memset(num,0,sizeof(num));}
 16     
 17     void clear()
 18     {
 19         len = 0;
 20         flag = false;
 21         memset(num,0,sizeof(num));
 22     }
 23 }ans;
 24 
 25 inline void swap(bign &a,bign &b)
 26 {
 27     bign tmp;
 28     tmp = a;
 29     a = b;
 30     b = tmp;
 31 }
 32 
 33 bool operator < (bign &a,bign &b)
 34 {
 35     if(a.len < b.len) return true;
 36     if(a.len > b.len) return false;
 37     int len = a.len;
 38     for(int i = 1;i <= len;++ i)
 39     {
 40         if(a.num[i] > b.num[i])
 41             return false;
 42     }
 43     return true;
 44 }
 45 
 46 bool operator == (bign &a,bign &b)
 47 {
 48     if(a.len != b.len) return false;
 49     for(int i = 1;i <= a.len;++ i)
 50         if(a.num[i] != b.num[i])
 51             return false;
 52     return true;
 53 }
 54 
 55 bign operator - (bign &a,bign &b)
 56 {
 57     ans.clear();
 58     int len;
 59     if(a < b)
 60     {
 61         ans.flag = true;
 62         len = b.len;
 63         for(int i = 1;i <= len;++ i)
 64         {
 65             ans.num[i] += b.num[i] - a.num[i];
 66             if(ans.num[i] < 0) ans.num[i] += 10,ans.num[i+1] --;
 67         }
 68     }
 69     else
 70     {
 71         ans.flag = false;
 72         len = a.len;
 73         for(int i = 1;i <= len;++ i)
 74         {
 75             ans.num[i] += a.num[i] - b.num[i];
 76             if(ans.num[i] < 0) ans.num[i] += 10,ans.num[i+1] --;
 77         }
 78     }
 79     while(!ans.num[len]) len --;
 80     ans.len = len;
 81     return ans;
 82 }
 83 
 84 inline bign get()
 85 {
 86     ans.clear();
 87     string s;
 88     cin>>s;
 89     int len = s.length();
 90     for(int i = 0;i < len;++ i)
 91         ans.num[len - i] = s[i]-0;
 92     ans.len = len;
 93     return ans;
 94 }
 95 
 96 inline void print(bign a)
 97 {
 98     if(a.flag) putchar(-);
 99     int len = a.len;
100     for(int i = len;i >= 1;-- i)
101         printf("%d",a.num[i]);
102     puts("");
103 }
104 
105 int main()
106 {
107     bign a,b;
108     a = get();
109     b = get();
110     if(a == b)
111         printf("0\n");
112     else
113         print(a-b);
114     return 0;
115 }

 

以上是关于洛谷 P2142 高精度减法 题解的主要内容,如果未能解决你的问题,请参考以下文章

P2142 高精度减法

洛谷 P1303 A*B Problem(高精度乘法) 题解

洛谷 P1601 A+B Problem(高精) 题解

3115 高精度练习之减法

11-9-2017 星期四 NOIp周

洛谷 P1106 删数问题 题解