第一次写技术博客,写得不好大家见谅。
前段时间参加网易实习笔试的时候遇到的一个问题:将一串数字表示为汉字,如:“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;//返回最终结果}