九度1026(unsigned int应用)

来源:互联网 发布:电路图仿真软件下载 编辑:程序博客网 时间:2024/06/05 00:16

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


解题思路:

刚开始用高精度+任意进制转换写残了······后来直接暴力。unsigned int 能够存储2倍的 int 数据。


完整代码:

#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;}unsigned int a , b;int m;int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    std::ios::sync_with_stdio(false);    std::cin.tie(0);    while(cin >> m)    {        if(m == 0)            break;        cin >> a >> b;        if(a == 0 && b == 0)        {            cout << "0" << endl;            continue;        }        unsigned int c = a + b;        string res = "";        while(c)        {            int k = c % m;            c /= m;            res += (char)(k + '0');        }        reverse(res.begin() , res.end());        cout << res << endl;    }}


0 0