题解 | #阿拉伯数字转中文#
阿拉伯数字转中文
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;
}
};