提交时间:2026-06-17 20:49:59

运行 ID: 91871

#include <iostream> #include <string> #include <vector> #include <sstream> #include <algorithm> using namespace std; string digits[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; string units_small[] = {"", "shi", "bai", "qian"}; // 个位无单位,十、百、千 string units_big[] = {"", "wan", "yi"}; // 个级无单位,万、亿 // 处理 0-9999 的数字,返回拼音向量 vector<string> convert_chunk(int n) { vector<string> res; if (n == 0) return res; bool zero_needed = false; // 标记是否需要读 ling int base = 1000; int started = 0; // 标记是否已经开始读非零数字 for (int i = 3; i >= 0; --i) { int d = n / base % 10; base /= 10; if (d != 0) { if (zero_needed && started) { res.push_back("ling"); zero_needed = false; } res.push_back(digits[d]); if (i > 0) { // 个位不需要单位 res.push_back(units_small[i]); } started = 1; } else { if (started) { zero_needed = true; } } } return res; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); long long n; if (!(cin >> n)) return 0; if (n == 0) { cout << "ling" << endl; return 0; } vector<string> result; // 分解为 亿, 万, 个 int yi_part = n / 100000000; int wan_part = (n % 100000000) / 10000; int ge_part = n % 10000; // 处理亿级 if (yi_part > 0) { vector<string> p = convert_chunk(yi_part); result.insert(result.end(), p.begin(), p.end()); result.push_back("yi"); } // 处理万级 if (wan_part > 0) { // 如果亿级存在,且万级不足4位(即高位有0),可能需要补 ling? // 例如 100010000 -> yi yi ling wan ...? // 标准读法:1,0001,0000 -> yi yi ling yi wan. // 我们的 convert_chunk(1) 返回 "yi". // 如果 yi_part > 0 且 wan_part < 1000,说明万级高位有0,需补 ling if (yi_part > 0 && wan_part < 1000) { // 检查是否真的需要 ling。如果 wan_part 是 0,则在 ge_part 处理。 // 如果 wan_part 非0但小于1000,比如 1,0001,0000。 // yi_part=1, wan_part=1. convert_chunk(1) -> "yi". // 此时应读 "yi yi ling yi wan". // 所以如果 yi_part > 0 且 wan_part < 1000,且 wan_part != 0,需补 ling? // 其实更简单的逻辑:如果上一级非空,且当前级数字不足4位(即隐含前导0),则加 ling result.push_back("ling"); } vector<string> p = convert_chunk(wan_part); result.insert(result.end(), p.begin(), p.end()); result.push_back("wan"); } else { // wan_part == 0 if (yi_part > 0 && ge_part > 0) { // 例如 1,0000,0001 -> yi yi ling yi result.push_back("ling"); } } // 处理个级 if (ge_part > 0) { // 如果万级或亿级存在,且 ge_part < 1000,需补 ling if ((yi_part > 0 || wan_part > 0) && ge_part < 1000) { // 同样,如果前一级非空,且当前级不足4位,补 ling // 但要注意,如果 wan_part 已经是 0 且我们刚才加了 ling,这里不要重复加? // 上面的逻辑:如果 wan_part==0 且 ge_part>0,已经加了 ling。 // 如果 wan_part>0 但 ge_part<1000,比如 1,1000,0001 -> ... wan ling yi. // 所以需要判断:如果 (yi_part > 0 || wan_part > 0) 且 ge_part < 1000,且上一个加入的不是 "ling" // 为了简化,我们可以统一逻辑: // 只要前有大数,且当前数 < 1000,就补 ling。 // 但如果 wan_part == 0,前面已经补过 ling 了。 // 检查 result 最后一个元素是否是 "ling" if (result.back() != "ling") { result.push_back("ling"); } } vector<string> p = convert_chunk(ge_part); result.insert(result.end(), p.begin(), p.end()); } // 特殊处理:开头的 "yi shi" 变为 "shi" // 只有当结果以 "yi" "shi" 开头时 if (result.size() >= 2 && result == "yi" && result == "shi") { result.erase(result.begin()); // 删除 "yi" } // 输出 for (size_t i = 0; i < result.size(); ++i) { if (i > 0) cout << " "; cout << result[i]; } cout << endl; return 0; }