失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 阿拉伯数字金额转中文大写金额 base C++

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

时间:2020-05-02 17:36:56

相关推荐

阿拉伯数字金额转中文大写金额 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;}

如果觉得《阿拉伯数字金额转中文大写金额 base C++》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。