NC340. 阿拉伯数字转中文
描述
示例1
输入:
114514
输出:
"十一万四千五百一十四"
示例2
输入:
1000
输出:
"一千"
示例3
输入:
-1035
输出:
"负一千零三十五"
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-07-11
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串 */ string num2cn(int n) { // write code here string s = to_string(abs(n)), res; const char* dict[] = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千", "万", "亿" }; if (n == 0) return dict[0]; int t = 0; for (int i = s.size() - 1; i >= 0;) { string curStr = ""; int cnt = 0; while (cnt < 4 && i >= 0) { int num = s[i] - '0'; if (num == 0) { while (cnt < 4 && i > 0 && num == 0) { i --; num = s[i] - '0'; cnt ++; } if (curStr != "") curStr = dict[0] + curStr; } else { if (cnt > 0) curStr = dict[9+cnt] + curStr; if (!(num == 1 && i == 0 && cnt == 1)) curStr = dict[num] + curStr; cnt ++; i --; } } if (t > 0 && curStr != "") curStr += dict[12+t]; res = curStr + res; t++; } if (n < 0) res = "负" + res; return res; }; };
C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-06-26
class Solution { public: string num2cn(int n) { string f; if (n < 0) { f += "负"; n = -n; } const char* Unit[] = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万"}; const char* Caps[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; vector<string> v; int i = 0; int a = -1; bool k = true; while (n) { int num = n % 10; if (num == 0) { if (!k && i > 0 && a != 0) { v.push_back(Caps[num]); } } else { if (k == true) { k = false; if (i > 8) v.push_back(Unit[8]); else if (i > 4) v.push_back(Unit[4]); } v.push_back(Unit[i]); if (num != n || strcmp(Unit[i], "十") != 0 || num != 1) { v.push_back(Caps[num]); } } a = num; n /= 10; ++i; } if (i == 0) { f += Caps[0]; } for (int i = v.size() - 1; i >= 0; --i) { f += v[i]; } return f; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-05-23
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串 */ string num2cn(int n) { // write code here string str; if(n < 0) { str += "负"; n = -n; } const char* danweis[] = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万"}; const char* num_to_chinese[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; vector<string> strs; int i = 0; int last = -1; bool is_first_non_zero = true; while(n) { int num = n % 10; if(num == 0) { if(!is_first_non_zero && i > 0 && last != 0) { strs.push_back(num_to_chinese[num]); } } else { if(is_first_non_zero == true) { is_first_non_zero = false; if(i > 8) strs.push_back(danweis[8]); else if(i > 4) strs.push_back(danweis[4]); } strs.push_back(danweis[i]); if(num != n || strcmp(danweis[i], "十") != 0 || num != 1) { strs.push_back(num_to_chinese[num]); } } last = num; n /= 10; ++i; } if(i == 0) { str += num_to_chinese[0]; } for(int i = strs.size() - 1; i >= 0; --i) { str += strs[i]; } return str; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-04-11
class Solution { string unitsMap[11] = { "", "十", "百", "千", "", "万", "亿" }; string sectionUnitsMap[11] = { "", "万", "亿", "万亿" }; string digitsMap[11] = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; public: void getChar(int n, string& ans) { // 每一节的单位 int sectionUnitPos = 0; // 当前节的String string sectionSb = ""; // 节与节间需不需要加0(规则3) bool needZero = false; while (n > 0) { int sectionNumber = n % 10000; if (needZero) { ans.insert(0, digitsMap[0]); } sectionSb = ""; sectionNumToChinese(sectionNumber, sectionSb); if (sectionNumber != 0) { sectionSb += sectionUnitsMap[sectionUnitPos]; } else { sectionSb += sectionUnitsMap[0]; } ans.insert(0, sectionSb); // 判断千位是否为0,以及后面是否有数字,从而知道section与section之间有没有0 if (sectionNumber < 1000 && sectionNumber > 0) { needZero = true; } else { needZero = false; } n /= 10000; sectionUnitPos++; } } void sectionNumToChinese(int sectionNumber, string& sectionSb) { int unitPos = 0; bool hasZero = true; while (sectionNumber > 0) { int digit = sectionNumber % 10; if (digit == 0) { if (!hasZero) { hasZero = true; sectionSb.insert(0, digitsMap[digit]); } } else { hasZero = false; string v = digitsMap[digit]; v += unitsMap[unitPos]; sectionSb.insert(0, v); } unitPos++; sectionNumber /= 10; } } string num2cn(int& n) { if (n == 0) { return "零"; } int num = abs(n); string ans = ""; getChar(num, ans); string tmp = to_string(num); if (tmp.size() == 2 && tmp[0] == '1') { ans.erase(0, 3); } if (tmp.size() == 10 && tmp[0] == '1') { ans.erase(0, 3); } if (n < 0) { ans = "负" + ans; } return ans; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 520KB, 提交时间: 2022-05-25
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串 */ string num2cn(int n) { // write code here string str; if(n < 0) { str += "负"; n = -n; } const char* danweis[] = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万"}; const char* num_to_chinese[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; vector<string> strs; int i = 0; int last = -1; bool is_first_non_zero = true; while(n) { int num = n % 10; if(num == 0) { if(!is_first_non_zero && i > 0 && last != 0) { strs.push_back(num_to_chinese[num]); } } else { if(is_first_non_zero == true) { is_first_non_zero = false; // 越过 万/亿 if(i > 8) strs.push_back(danweis[8]); else if(i > 4) strs.push_back(danweis[4]); } strs.push_back(danweis[i]); if(num != n || strcmp(danweis[i], "十") != 0 || num != 1) { strs.push_back(num_to_chinese[num]); } } last = num; n /= 10; ++i; } if(i == 0) { str += num_to_chinese[0]; } for(int i = strs.size() - 1; i >= 0; --i) { str += strs[i]; } return str; } };