题解 | #阿拉伯数字转中文#

阿拉伯数字转中文

https://www.nowcoder.com/practice/6eec992558164276a51d86d71678b300

一.当前数值为0的时候可以标零的两种情况:
一.当前数值为零时!is_first_non_zero&&last != 0可以标零
1.!is_first_non_zero初始化为true,每隔四个值初始化一次is_first_none_zero为true
当前面出现非零值,并且当前值为零值时可以标零,比如一百零五,前面出现五
(倒序排的数值),并且当前数值为零的时候可以标零
2.last != 0时标零防止重复,比如一千零四不能读作一千零零4
二.当前数值不为零时
1.(四个数为一组的情况下)前面没有非零数值出现,即标志is_first_non_zero=true的情况下
压入万/亿,并且is_first_none_zero = false
只有出现非零数值才压入"万"/"亿"这两种对应数值,比如五十万,这里需要压入的原因
在于前面出现零没有压入,五十万在五后面的零没有压入万,直到出现了五才压入万
2.压入当前数位
3.如果是num==n&&danweis[i]=="十"&&num==1,不压入当前数值
num==n代表最后一位,danweis[i]="十"&&num==1代表当前数值为一十,即
一十如果为打头的时候,我们只要说十就可以了
完整代码如下
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 && last != 0) 
                {
                                       
                    strs.push_back(num_to_chinese[num]);
                }
            } 
            else 
            {
                if(is_first_non_zero == true) 
                {
                    
                    is_first_non_zero = false;
                    if(i > 8&&i%4 != 0)
                    //超过当前数值并且不是新一轮的情况(4个数值为一轮)
                    {
                        strs.push_back(danweis[8]);
                    }
                    else if(i > 4&&i%4 != 0) 
                    //超过当前数值并且不是新一轮的情况(如果是万或者亿数值的情况下,
                                       //后面的strs.push_back(danweis[i]就会自动放入当前的万或者亿,
                                       //这里就重复添加了)
                    {
                        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%4 == 0)
            //四位数值一组重置标志
            {
                is_first_non_zero = true;
            }
        }
        if(i == 0) {
            str += num_to_chinese[0];
        }
        for(int i = strs.size() - 1; i >= 0; --i) {
            str += strs[i];
        }
        return str;
    }
};    


全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务