高精度--大数减法 luogu 2142

来源:互联网 发布:中日友好靠韩国知乎 编辑:程序博客网 时间:2024/05/18 02:31

P2142 高精度减法

    • 2.7K通过
    • 9.1K提交
  • 题目提供者PercyButtons
  • 标签洛谷原创
  • 难度普及-
  • 时空限制1s / 128MB

  讨论  题解  

最新讨论更多讨论

  • 求助!(怀疑数据)
  • 请问,为什么会出错呢?
  • 第二个点发生了什么
  • ...深坑
  • 大神帮忙看一下,第二个测试…
  • 哪里错了帮忙看看

题目描述

高精度减法

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

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

说明

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

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































#include<iostream>#include <cstdio>#include <ctype.h>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int maxn=10010;char s1[1000000],s2[1000000];char res[1000000];bool cmp(string a,string b){   if (a.size() < b.size()) return true;  //当a的位数比b小时,a比b小    if (a.size() > b.size()) return false; //当a的位数比b大时,a比b大    for (int i = 0; i < a.size(); ++i)     //剩余情况就是a的位数与b相同    {        if (a[i] > b[i]) return false;     //逐位比较        if (b[i] > a[i]) return true;    }    return false;}bool cmp1(string a,string b){for(int i=0;i<a.size();i++)if(a[i]!=b[i])return 0;return 1;}void jian(char *a,char *b){int lena=strlen(a);int lenb=strlen(b);if(lena!=lenb)for(int i=lenb;i<lena;i++)b[i]='0';reverse(a,a+lena);reverse(b,b+lenb);int c=0;for(int i=0;i<lena;i++){int t=(a[i]-'0')-(b[i]-'0')-c;c=(t<0);res[i]=(t+10*c)+'0';}res[lena]='\0';while(lena>1&&a[lena-1]=='0')a[--lena]='\0';reverse(res,res+lena);}int main(){cin>>s1;cin>>s2;if(cmp(s1,s2)){swap(s1,s2);cout<<"-";}if(cmp1(s1,s2)){cout<<0<<endl;return 0;}jian(s1,s2);cout<<res<<endl;return 0;}