九度1003(高精度模板)

来源:互联网 发布:淘宝卖家下载什么软件 编辑:程序博客网 时间:2024/05/01 04:31

题目链接:http://ac.jobdu.com/problem.php?pid=1003


解题思路:

高精度模板,计算之后要特殊判断负号问题。另外要注意-0这种情况,即res = 0的话,前面不能出现负号。


完整代码:

#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;/**BigNumber  **/const int ten[4] = {1 , 10 , 100 , 1000};const int maxl = 1000;struct BigNumber{    int d[maxl];    BigNumber(string s){        int len = s.size();        d[0] = (len - 1) / 4 + 1;        int i , j , k;        for(i = 1 ; i < maxl ; i ++)    d[i] = 0;        for(i = len - 1 ; i >= 0 ; i --){            j = (len - i - 1) / 4 + 1;            k = (len - i - 1) % 4;            d[j] += ten[k] * (s[i] - '0');        }        while(d[0] > 1 && d[d[0]] == 0)    --d[0];    }    BigNumber(){        *this = BigNumber(string("0"));    }    string toString(){        string s("");        int i , j , temp;        for(i = 3 ; i >= 1 ; i --){            if(d[d[0]] >= ten[i])                break;        }        temp = d[d[0]];        for(j = i ; j >= 0 ; j --){            s = s + (char)(temp / ten[j] + '0');            temp %= ten[j];        }        for(i = d[0] - 1 ; i > 0 ; i --){            temp = d[i];            for(j = 3 ; j >= 0 ; j --){                s = s + (char)(temp / ten[j] + '0');                temp %= ten[j];            }        }        return s;    }}zero("0") , d , temp , midl[15];BigNumber operator + (const BigNumber &a , const BigNumber &b){    BigNumber c;    c.d[0] = max(a.d[0] , b.d[0]);    int i , x = 0;    for(i = 1 ; i <= c.d[0] ; i ++){        x = a.d[i] + b.d[i] + x;        c.d[i] = x % 10000;        x /= 10000;    }    while(x != 0){        c.d[++c.d[0]] = x % 10000;        x /= 10000;    }    return c;}BigNumber operator - (const BigNumber &a , const BigNumber &b){    BigNumber c;    c.d[0] = a.d[0];    int i , x = 0;    for(i = 1 ; i <= c.d[0] ; i ++){        x = 10000 + a.d[i] - b.d[i] + x;        c.d[i] = x % 10000;        x = x / 10000 - 1;    }    while((c.d[0] > 1) && (c.d[c.d[0]] == 0))   -- c.d[0];    return c;}//////////////End·········//////////////////////////////////////string t1 , t2;bool check(string a , string b){    int lena = a.length();    int lenb = b.length();    if(lena > lenb)        return true;    else if(lena == lenb)        return a > b;    else if(lena < lenb)        return false;}int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    std::ios::sync_with_stdio(false);    std::cin.tie(0);    while(cin >> t1 >> t2)    {        int len1 = t1.length();        int len2 = t2.length();        string a = "" , b = "";        int flag1 = 0 , flag2 = 0;        for(int i = 0 ; i < len1 ; i ++)        {            if(t1[i] == '-')            {                flag1 = 1;                continue;            }            if(t1[i] == ',')                continue;            else                a += t1[i];        }        for(int i = 0 ; i < len2 ; i ++)        {            if(t2[i] == '-')            {                flag2 = 1;                continue;            }            if(t2[i] == ',')                continue;            else                b += t2[i];        }        BigNumber res1(a) , res2(b) , res;        int flag = 0;        if(flag1 == 1)        {            if(flag2 == 0)            {                if(check(a , b))                {                    res = res1 - res2;                    if(res.toString() != "0")                        flag = 1;                }                else                {                    res = res2 - res1;                }            }            else            {                res = res1 + res2;                if(res.toString() != "0")                    flag = 1;            }        }        else        {            if(flag2 == 0)            {                res = res1 + res2;            }            else            {                if(check(a , b))                {                    res = res1 - res2;                }                else                {                    res = res2 - res1;                    if(res.toString() != "0")                        flag = 1;                }            }        }        if(flag)            cout << "-" ;        cout << res.toString() << endl;    }}


0 0
原创粉丝点击