| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 91872 | sh25_shenpy | 数的读法 | C++ | 通过 | 0 MS | 276 KB | 4549 | 2026-06-17 20:51:12 |
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; // 定义拼音映射 const string digits[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; const string units_small[] = {"", "shi", "bai", "qian"}; // 个、十、百、千 const string units_big[] = {"", "wan", "yi"}; // 个级、万级、亿级 // 将 0-9999 的数字转换为拼音向量 // 参数 need_zero_prefix: 如果上一级非空且当前级数字小于1000,通常需要补一个 ling,这个标志由外部控制 vector<string> convert_chunk(int n, bool add_leading_zero) { vector<string> res; if (n == 0) { return res; } // 如果需要前导零(例如 1,0001 -> yi wan ling yi),且当前数字确实需要(即不是整个数的最高级,或者内部逻辑需要) // 注意:这里的 add_leading_zero 是由调用者根据上下文决定的 if (add_leading_zero) { res.push_back("ling"); } bool zero_flag = false; // 记录是否遇到了未处理的零 bool has_non_zero = false; // 记录是否已经输出了非零数字 int base = 1000; for (int i = 3; i >= 0; --i) { int d = n / base % 10; base /= 10; if (d != 0) { if (zero_flag) { res.push_back("ling"); zero_flag = false; } res.push_back(digits[d]); if (i > 0) { // 个位不加单位 res.push_back(units_small[i]); } has_non_zero = true; } else { // 如果当前位是0,且之前已经有非零数字出现,则标记需要读零 if (has_non_zero) { zero_flag = 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; } // 分解数字 int yi = n / 100000000; int wan = (n % 100000000) / 10000; int ge = n % 10000; vector<string> result; // 1. 处理亿级 if (yi > 0) { vector<string> part = convert_chunk(yi, false); result.insert(result.end(), part.begin(), part.end()); result.push_back("yi"); } // 2. 处理万级 if (wan > 0) { // 判断是否需要补 ling: // 如果亿级存在,且万级不足4位(即 wan < 1000),则亿级和万级之间需要 ling // 例如 1,0001,0000 -> yi yi ling yi wan bool need_zero = (yi > 0 && wan < 1000); vector<string> part = convert_chunk(wan, need_zero); result.insert(result.end(), part.begin(), part.end()); result.push_back("wan"); } else { // wan == 0 // 如果亿级存在,且个级存在,则亿级和个级之间需要 ling // 例如 1,0000,0001 -> yi yi ling yi if (yi > 0 && ge > 0) { result.push_back("ling"); } } // 3. 处理个级 if (ge > 0) { // 判断是否需要补 ling: // 如果亿级或万级存在,且个级不足4位(ge < 1000),则需要 ling // 但要注意:如果万级是0,上面已经加过 ling 了,不能重复加 // 如果万级非0,但 ge < 1000,则需要加 ling bool need_zero = false; if (yi > 0 || wan > 0) { if (ge < 1000) { // 检查 result 最后一个元素是不是 "ling",如果是,说明万级为0时已经加过了 if (result.empty() || result.back() != "ling") { need_zero = true; } } } vector<string> part = convert_chunk(ge, need_zero); result.insert(result.end(), part.begin(), part.end()); } // 4. 特殊规则处理:开头的 "yi shi" 变为 "shi" // 仅当整个结果以 "yi" "shi" 开头时生效 // 例如 10 -> shi, 100000 -> shi wan // 但 110 -> yi bai yi shi (不变), 1010 -> yi qian ling yi shi (不变) if (result.size() >= 2 && result[0] == "yi" && result[1] == "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; }