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

前段时间参加网易实习笔试的时候遇到的一个问题:将一串数字表示为汉字,如: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;//返回最终结果}