列表

详情


NC340. 阿拉伯数字转中文

描述

给定一个整数,请你输出这个整数的中文读法。
例如:
153,读作一百五十三
103,读作一百零三
1003,读作一千零三

数据范围:

示例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;
    }
};

上一题