阿拉伯数字金额转中文大写金额 base C++

背景: 这是美团9月11号下午15点的笔试编程题第一题, 当时是可以写,但是时间真的不多,然后思绪变得混乱, 然后私下来把它写了, 还是比较考代码力的…

描述: 就给定很多数字金额 最大不过1000000000000(一万亿元整) , 小数点后最多2位小数, 问转换后的结果…

注: 不过因为是后面补的题, 已经没地方交了, 所以不一定保证完全正确, 但是我个人认为是很对的…

一些样例:
200.00 贰佰元整
200.01 贰佰元零壹分
200.1 贰佰元壹角
201.15 贰佰零壹元壹角伍分
1000000000000 壹万亿元整
100000000000 壹仟亿元整
1000000000 壹拾亿元整
10000000 壹仟万元整
100000 壹拾万元整
23489623816 贰佰叁拾肆亿捌仟玖佰陆拾贰万叁仟捌佰壹拾陆元整
1001001001 壹拾亿零壹佰万壹仟零壹元整
1000001 壹佰万零壹元整
10101010.23 壹仟零壹拾万壹仟零壹拾元贰角叁分
11110.01 壹万壹仟壹佰壹拾元零壹分
100.2 壹佰元贰角

string snum[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
string sdecimal[] = {"角", "分"};
string sinterval[] = {"元", "万", "亿", "万"};
string sunit[] = {"拾", "佰", "仟"};

string workDecimal(string point) {
    string ans;
    for (int i = 0 ; i < point.size() ; ++ i) {
        int id = point[i] - '0';
        if (!i || id) ans += snum[id];
        if (id) ans += sdecimal[i];
    }
    if (ans == "零") ans.clear();
    return ans;
}

string workInteger(string sinteger, int tot) {
    vector<string>ve;
    ve.push_back(sinterval[tot]);
    int last = 1, cntSunit = -1;
    for (int i = sinteger.size() - 1; i >= 0; -- i) {
        int id = sinteger[i] - '0';
        if (i != sinteger.size() - 1) ++ cntSunit;
        if (!id && last) continue;
        if (!id) ve.push_back(snum[id]), last = 1;
        else {
            if (i != sinteger.size() - 1) ve.push_back(sunit[cntSunit]);
            ve.push_back(snum[id]), last = 0;
        }
    }
    string ans;
    if (tot == 1 && ve.size() == 1) return ans;
    // 如果万级别都是零, 那么后面的至少都是亿开头, 这个万就不能要.
    for (int i = ve.size() - 1 ; i >= 0 ; -- i) {
        ans += ve[i];
    }
    // 汉字的字符串不能直接reverse, 所以只能这样.
    return ans;
}

string getAns(string target) {
    string sdecimal;
    int pos = target.size();
    if (target.find(".") != string::npos) {
        pos = target.find(".");
        sdecimal = workDecimal(target.substr(pos+1));
    }
    vector<string>ve; int tot = 0;
    // 思想就是小数点后的单独处理, 前面的四位一下处理, 因为倒着算容易知道当前
    // 位是4位的第几位, 方便加量词.
    for (int i = pos - 1; i >= 0;) {
        if (i - 3 >= 0) ve.push_back(workInteger(target.substr(i - 3, 4), tot++)), i -= 4;
        else ve.push_back(workInteger(target.substr(0, i+1), tot++)), i = -1;
    }
    string ans;
    for (int i = ve.size() - 1 ; i >= 0 ; -- i) {
        ans += ve[i];
    }
    if (!sdecimal.size()) ans += "整";
    else ans += sdecimal;
    return ans;
}

void solve() {
    string s; // s 是待转换的字符串
    cin >> s;
    cout << s << ' ' << getAns(s) << endl;
}

你可能感兴趣的:(经典模拟)