第一次写技术博客,写得不好大家见谅。

前段时间参加网易实习笔试的时候遇到的一个问题:将一串数字表示为汉字,如:12340650”对应表示为“一仟贰佰叁拾肆万零陸佰伍十”,当时怎么也想不出来,昨天突然又想起这个问题,在网上没找到完整的代码,就试着自己写,由于技术有限,花了一天半才完成,写得不好希望大家不要见怪。

下面把我的思路说一下:我感觉这个问题有几个难点,1、必须注意中间零和尾零的区别,2、“万”与“亿”算是一个分割点,单位的变化是“个拾佰仟万亿”,然后又重复前面的如“拾万,佰万”,“拾亿,佰亿”等。3、当进入万位或者亿位时,“万”与“亿”只能出现在刚进入的位置。

下面把代码贴上:

string numChange(long n){//功能:将一串数字转换为汉子形式,如“1203456”——“壹佰贰拾万零叁仟肆佰伍拾陸”
      
    int sumdigit = 0;//记录位数
    int zerosum = 0;//记录中间零的个数,实际只是用来标识中间是否有零
    string Chnum[] = {"零","壹","贰","叁","肆","伍","陸","柒","捌","玖"}; 
    string Chtime[] = {"个","拾","佰","仟","万","拾","佰","仟","亿","拾"};//“个”必须有,可以减少编程麻烦,因为每个非零值都会带单位,这样个位非零时可以统一处理
    string result = "";//存储最终结果
    bool wan_time = false;//标识是否第一次进入万位
    bool yi_time = false;//标识是否第一次进入亿位
    while(n >= 1){//循环分离出数据各位上的数
        sumdigit++;
        if(sumdigit == 5) wan_time = true;//表示有万位
        if(sumdigit == 9) yi_time = true;//表示有亿位
        switch(n%10){//根据余数的取值进入不同分支
        case 0:
            if(result != ""){//记录中间零
                zerosum ++;
            }  
            break;//中断分支
        default://余数非零分支
            if(zerosum > 0){//存在中间零,
                result =Chnum[0] + result;
                zerosum = 0;//零标志清零,准备下一次中间零计数
            }
            if(yi_time){//第一次进入亿位
                if(sumdigit == 9){//亿位不为零
                    result = Chnum[n%10] + Chtime[sumdigit - 1] + result;   
                }else{//亿位为零,拾亿位或者佰亿位等不为零
                    result = Chnum[n%10] + Chtime[sumdigit - 1] + "亿" + result;
                }
                yi_time = false;//进入亿位后,不再需要标识
                break;//中断分支
            }
            if(wan_time){//第一次进入万位
                if(sumdigit == 5){//万位不为零
                    result = Chnum[n%10] + Chtime[sumdigit - 1] + result;
                }else{
                    result = Chnum[n%10] + Chtime[sumdigit - 1] + "万" + result; 
                }
                wan_time = false;//进入万位后,不再需要标识
                break;//中断分支
            }
            result = Chnum[n%10] + Chtime[sumdigit-1] + result;//当非零值不是分界的亿、万位时,进行当前位值与位单位以及之前中间结果三者的组合
        }
        n /= 10;//完成一次取数,进入下一轮
    }
    if(result.substr(result.length()-2,result.length()-1)=="个"){//消除个为非零时所带来的单位“个”
        result = result.substr(0,result.length()-1);
    }
    return result;//返回最终结果
}