栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3482 ‘JBC’

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3482 ‘JBC’

#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <map>#include <limits>#include <algorithm>using namespace std;const int maxn = 20000;struct bign{    int len, s[maxn];    bign(){memset(s, 0, sizeof(s)); len = 1;}    bign(int num){*this = num;}    bign(char *num){*this = num;}    bign operator = (const char* num){        len = strlen(num);        for(int i = 0; i < len; i++) s[i] = num[len - i - 1] - '0';//反转        return *this;    }    bign operator = (const int num){        char s[maxn];        sprintf(s, "%d", num);        *this = s;        return *this;    }    string str() const {        string res = "";        for(int i = 0; i < len; i++) res = (char)(s[i] + '0') + res;        if(res == "") res = "0";        return res;    }    bign operator + (const bign & b) const {        bign c;        c.len = 0;        for(int i = 0, g = 0; g || i < max(len, b.len); i++){// g 只判断最后是否进位 int x = g; if(i < len) x += s[i]; if(i < b.len) x += b.s[i]; c.s[c.len++] = x % 10; g = x / 10;        }        return c;    }    bign operator += (const bign & b) {        *this = *this + b;        return *this;    }    void clean(){        while(len > 1 && !s[len - 1])   len--;    }    bign operator - (const bign & b){        bign c; c.len = 0;        for(int i = 0, g = 0; i < len; i++){ int x = s[i] - g; if(i < b.len)   x -= b.s[i]; if(x >= 0)  g = 0; else {g = 1; x += 10;} c.s[c.len++] = x;        }        c.clean();        return c;    }    bign operator -= (const bign & b){        *this = *this - b;        return *this;    }    bign operator * (const bign &b){        bign c;        c.len = len + b.len;        for(int i = 0; i < len; i++) for(int j = 0; j < b.len; j++)     c.s[i + j] += s[i] * b.s[j];        for(int i = 0; i < c.len - 1; i++){ c.s[i + 1] += c.s[i] / 10; c.s[i] %= 10;        }        c.clean();        return c;    }    void digit_shift(bign & n, int d) {        int i;        if(n == 0) return;        for(i = n.len - 1; i >= 0; i--) n.s[i + d] = n.s[i];        for(i = 0; i < d; i++) n.s[i] = 0;        n.len = n.len + d;    }    bign operator / (const bign& b){        bign row;        bign c;        c.len = len;        int i, j;        for(i = len - 1; i >= 0; i--){ digit_shift(row, 1); row += s[i]; c.s[i] = 0; while(row >= b){     c.s[i]++;     row -= b; }        }        c.clean();        return c;    }    bool operator < (const bign & b) const{        if(len != b.len)    return len < b.len;        for(int i = len - 1;i >= 0; i--) if(s[i] != b.s[i])  return s[i] < b.s[i];        return false;    }    bool operator > (const bign & b) const { return b < *this;}    bool operator <= (const bign & b) const {return !(b < *this);}    bool operator >= (const bign & b) const {return !(*this < b);}    bool operator != (const bign & b) const {return b < *this || *this < b;}    bool operator == (const bign & b) const {return !(b < *this) && !(*this < b);}};istream & operator >> (istream & in, bign & x){    string s;    in>>s;    x = s.c_str();    return in;}ostream & operator << (ostream & out, const bign & x){    out<<x.str();    return out;}map<char, int> mp;string input;int main(){    bool flag = false;    int k = 0, len, begin;    bign num, sum, mod;    //freopen("input.txt", "r", stdin);    while(true){        flag = false;        while(getline(cin, input)){ if(input.size() == 0 && flag) break; else if(input.size() == 0 && !flag) continue; else {     while(input[0] == ' ') input.erase(input.begin());     while(input[input.size() - 1] == ' ') input.erase(input.size() - 1, 1);     if(!flag){         if(k) cout<<endl;         mp.clear();         k = 1;         flag = true;         len = input.size();         for(int i = 0; i < len; i++)  mp[input[i]] = i;     }else {         begin = 2;         for(int i = 0; i < input.size(); i++)  if(mp.count(input[i]) && begin < mp[input[i]] + 1)      begin = mp[input[i]] + 1;         sum = 0;         for(; begin <= len; begin++){  mod = 1; num = 0;  for(int j = input.size() - 1; j >= 0; j--){      if(mp.count(input[j])){          num = num + mod * mp[input[j]];          mod =  mod * begin;      }  }  sum = sum + num;         }         cout << sum << endl;     } }        }        if(!flag) break;    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号