今天继续看《算法的乐趣》,学习了阿拉伯数字与中文数字的转化。

汉字用零一二三四五六七八九作为基本计数,与阿拉伯数字靠数字偏移位置的权位不一样,中文数字是才有“数字+权位”的方式组成数字,比如百,千,万。

中文数字每个数字后都会跟上一个权位,权位就是数字的量值,相当于阿拉伯数字的数位。

中文计数以万为小节,万以下没有节权,万之上是亿为节权。

中文还有一个特点是多变的“零”,大概总结为三个规则:

1.以10000为小节,小节的结尾即使是0,也不使用“零”。
2.小节内两个非0数字之间要使用“零”。
3.当小节的“千”位是0时,若本小节的前一小节无其他数字,则不用“零”,否则就要用“零”。

算法设计:

首先定义三个字符串数组,存放数字位、节权位、权位

然后再分两个方法实现,一个实现节权的操作处理,还有一个实现小节内的操作。

第二个程序是实现中文数字转化为阿拉伯数字,这个我看不懂书上的一小部分代码,但是我读懂了作者的思想,所以我自己写了一个与书上不一样的算法出来,但是思想是一样的。

都是通过节权处分里小节,然后逐个小节计算,然后再合并得到结果。

下面是我的代码:

public class Main {public static void main(String[] args) {Main ma = new Main();Tool to = new Tool();ma.initMain();}public void initMain(){testNumberToChinese();System.out.println("————————————————————————————————————————");testChineseToNumber();}public void testNumberToChinese(){NumberChangeToChinese numToChinese = new NumberChangeToChinese();System.out.println("0:"+numToChinese.numberToChinese(0));System.out.println("1:"+numToChinese.numberToChinese(1));System.out.println("2:"+numToChinese.numberToChinese(2));System.out.println("3:"+numToChinese.numberToChinese(3));System.out.println("4:"+numToChinese.numberToChinese(4));System.out.println("5:"+numToChinese.numberToChinese(5));System.out.println("6:"+numToChinese.numberToChinese(6));System.out.println("7:"+numToChinese.numberToChinese(7));System.out.println("8:"+numToChinese.numberToChinese(8));System.out.println("9:"+numToChinese.numberToChinese(9));System.out.println("10:"+numToChinese.numberToChinese(10));System.out.println("11:"+numToChinese.numberToChinese(11));System.out.println("110:"+numToChinese.numberToChinese(110));System.out.println("111:"+numToChinese.numberToChinese(111));System.out.println("100:"+numToChinese.numberToChinese(100));System.out.println("102:"+numToChinese.numberToChinese(102));System.out.println("1020:"+numToChinese.numberToChinese(1020));System.out.println("1001:"+numToChinese.numberToChinese(1001));System.out.println("1015:"+numToChinese.numberToChinese(1015));System.out.println("1000:"+numToChinese.numberToChinese(1000));System.out.println("10000:"+numToChinese.numberToChinese(10000));System.out.println("20010"+numToChinese.numberToChinese(20010));System.out.println("20001"+numToChinese.numberToChinese(20001));System.out.println("100000:"+numToChinese.numberToChinese(100000));System.out.println("1000000:"+numToChinese.numberToChinese(1000000));System.out.println("10000000"+numToChinese.numberToChinese(10000000));System.out.println("100000000:"+numToChinese.numberToChinese(100000000));System.out.println("1000000000"+numToChinese.numberToChinese(1000000000));System.out.println("2000105"+numToChinese.numberToChinese(2000105));System.out.println("20001007:"+numToChinese.numberToChinese(20001007));System.out.println("2005010010:"+numToChinese.numberToChinese(2005010010));}public void testChineseToNumber(){ChineseChangeToNumber chineseToNumber = new ChineseChangeToNumber();System.out.println("二十亿零五千五百零一万四千零一十:"+chineseToNumber.ChineseToNumber("二十亿零五千五百零一万四千零一十"));System.out.println("二千万一千零七:"+chineseToNumber.ChineseToNumber("二千万一千零七"));System.out.println("二万零一:"+chineseToNumber.ChineseToNumber("二万零一"));System.out.println("二万零一十:"+chineseToNumber.ChineseToNumber("二万零一十"));System.out.println("一万:"+chineseToNumber.ChineseToNumber("一万"));System.out.println("一千零一十五:"+chineseToNumber.ChineseToNumber("一千零一十五"));System.out.println("一千:"+chineseToNumber.ChineseToNumber("一千"));System.out.println("一亿:"+chineseToNumber.ChineseToNumber("一亿"));}
}

这是主类,用于启动程序和测试。

public class NumberChangeToChinese {public String numberToChinese(int num){//转化一个阿拉伯数字为中文字符串if(num == 0){return "零";}int unitPos = 0;//节权位标识String All = new String();String chineseNum = new String();//中文数字字符串boolean needZero = false;//下一小结是否需要补零String strIns = new String();while(num>0){int section = num%10000;//取最后面的那一个小节if(needZero){//判断上一小节千位是否为零,为零就要加上零All = Tool.chnNumChar[0] + All;}chineseNum = sectionTOChinese(section,chineseNum);//处理当前小节的数字,然后用chineseNum记录当前小节数字if( section!=0 ){//此处用if else 选择语句来执行加节权位strIns = Tool.chnUnitSection[unitPos];//当小节不为0,就加上节权位chineseNum = chineseNum + strIns;}else{strIns = Tool.chnUnitSection[0];//否则不用加chineseNum = strIns + chineseNum;}All = chineseNum+All;chineseNum = "";needZero = (section<1000) && (section>0);num = num/10000;unitPos++;}return All;}public String sectionTOChinese(int section,String chineseNum){String setionChinese = new String();//小节部分用独立函数操作int unitPos = 0;//小节内部的权值计数器boolean zero = true;//小节内部的制零判断,每个小节内只能出现一个零while(section>0){int v = section%10;//取当前最末位的值if(v == 0){if( !zero ){zero = true;//需要补零的操作,确保对连续多个零只是输出一个chineseNum = Tool.chnNumChar[0] + chineseNum;}}else{zero = false;//有非零的数字,就把制零开关打开setionChinese = Tool.chnNumChar[v];//对应中文数字位setionChinese = setionChinese + Tool.chnUnitChar[unitPos];//对应中文权位chineseNum = setionChinese + chineseNum;}unitPos++;section = section/10;}return chineseNum;}
}

这第二个是阿拉伯数字转化成中文数字的类,实现的过程大致跟书上的一样。
下面是第三个中文转化成阿拉伯数组的类:

public class ChineseChangeToNumber {public int ChineseToNumber(String str){String str1 = new String();String str2 = new String();String str3 = new String();int k = 0;boolean dealflag = true;for(int i=0;i<str.length();i++){//先把字符串中的“零”除去if('零' == (str.charAt(i))){str = str.substring(0, i) + str.substring(i+1);}}String chineseNum = str;for(int i=0;i<chineseNum.length();i++){if(chineseNum.charAt(i) == '亿'){str1 = chineseNum.substring(0,i);//截取亿前面的数字,逐个对照表格,然后转换k = i+1;dealflag = false;//已经处理}if(chineseNum.charAt(i) == '万'){str2 = chineseNum.substring(k,i);str3 = str.substring(i+1);dealflag = false;//已经处理}}if(dealflag){//如果没有处理str3 =  chineseNum;}int result = sectionChinese(str1) * 100000000 +sectionChinese(str2) * 10000 + sectionChinese(str3);return result;}public int sectionChinese(String str){int value = 0;int sectionNum = 0;for(int i=0;i<str.length();i++){int v = (int) Tool.intList.get(str.charAt(i));if( v == 10 || v == 100 || v == 1000 ){//如果数值是权位则相乘sectionNum = v * sectionNum;value = value + sectionNum;}else if(i == str.length()-1){value = value + v;}else{sectionNum = v;}}return value;}
}

这真真正正是我自己一个个字写的,都是通过思考得出的结果,可能有些不严谨,但是确实可以实现。
第四个是工具类,存放字符串数据用的。


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;public class Tool {//数字位public static String[] chnNumChar = {"零","一","二","三","四","五","六","七","八","九"};public static char[] chnNumChinese = {'零','一','二','三','四','五','六','七','八','九'};//节权位public static String[] chnUnitSection = {"","万","亿","万亿"};    //权位public static String[] chnUnitChar = {"","十","百","千"};public static HashMap intList = new HashMap();static{for(int i=0;i<chnNumChar.length;i++){intList.put(chnNumChinese[i], i);}intList.put('十',10);intList.put('百',100);intList.put('千', 1000);}}

下面的图片是我的测试结果:
第一幅图是阿拉伯数字转化成中文:

第二张图片是中文数字转化成阿拉伯数字的:

这个数字转化算法,我看了几个小时才看懂一点点,然后在编程的时候,遇到了诸多问题,但是我最后都是独自一个个解决了,没有问别人,遇到了一些基本数据类型的问题,比如int型不能超过21亿," "两个点的是字符串类型,’ '一个点的是字符类型,这个问题我在传入HashMap队列中的时候就卡得我很烦躁,传入的字符串类型,然后用字符串的CharAt()去调用,结果当然是出现异常错误,无法编译了。

还有用了一个没有必要的二重循环去检测,其实没有必要,队列有现成的方法让我去用,二重循环中还出现了死循环,在第二重里写错成了i++(其实应该是j++),导致循环不断。

算法学习之路不易,但是贵在坚持,我在编程这几个小时里常常想不出解决方案,遇到bug无法解决,但是又没有人问。快哭了

但是没关系,我坚持了下来,解决了我遇到的一切问题,在算法这条路上再前进了一小步,我相信我以后的IT之路一定可以越走越远,越走越宽。奋斗

以上是读取别人博客放入自己博客以做备忘, 转载地址: 原文地址

以下是我阅后奇想思路:

public class VedioExtractSpeech {public static void main(String[] args) {System.out.println("toChinese:"+toChinese("12304562156"));
//        System.out.println("toChinese2:"+toChinese2("1230456"));}private static String toChinese(String str) {String[] s1 = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };String[] s2 = { "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千" };String result = "";int n = str.length();for (int i = 0; i < n; i++) {int num = str.charAt(i) - '0';if (i != n - 1 && num != 0) {result += s1[num] + s2[n - 2 - i];} else {result += s1[num];}}return result;}private static String toChinese2(String str) {String[] s2 = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};StringBuffer sb=new StringBuffer();for (char c : str.toCharArray()) {sb.append(s2[Integer.parseInt(String.valueOf(c))]);}return sb.toString();}
}

阿拉伯数字转换成中文算法--计数单位相关推荐

  1. 将一组阿拉伯数字转换成中文大写数字

    题目大概:  将一组阿拉伯数字转换成中文大写数字  52306 ==> 伍万贰千叁百零陆 我实现了将文件中的一组数字(每行为一个数)  形如: Java代码   25364 466932300 ...

  2. java练习:金额转换,阿拉伯数字转换成中文传统形式

    需求:金额转换,阿拉伯数字转换成中文传统形式   ,例如 101000001010   转为     壹仟零壹拾亿零壹仟零壹拾圆整 最终版: import java.util.Scanner; pub ...

  3. js将阿拉伯数字转换成中文的大写数字

    js将阿拉伯数字转换成中文的大写数字 export const numberToChinese = (num) => {var AA = new Array("零", &qu ...

  4. python练习题--阿拉伯数字转换成中文数字

    python练习题–阿拉伯数字转换成中文数字 用户输入任意阿拉伯数字,如[123456],把它转换成中文数字[壹拾贰万叁仟肆佰伍拾陆] 以前面试时面试官问的问题,当时没能答出来,今天初步解决,把它记录 ...

  5. 【工具封装】Python 实现将阿拉伯数字 === 转换成中文大写数字

    一.序言:   工具封装第四弹,阿拉伯数字 ===> 转换成 ===> 中文大写数字,喜欢就赶紧收藏+点赞+关注吧 !!! ---- Nick.Peng 二.实现代码如下: #!/usr/ ...

  6. 将阿拉伯数字转换成中文大写金额的形式

    问题:编写控制台程序,用户输入阿拉伯数字的金额,系统自动转换成中文大写金额的形式输出. 例如:输入458796: 转换为:肆拾伍万捌仟柒佰玖拾陆. 问题分析:既然是数字大小写转换,那么我们这样考虑问题 ...

  7. C#实现的【阿拉伯数字转换成中文大写金额】

    //作者:fanz2000 //Email:fanz2000@sohu.com /// /// 转换数字金额主函数(包括小数) /// /// 数字字符串 /// 转换成中文大写后的字符串或者出错信息 ...

  8. python数字转换成中文大写_python初学者笔记(2):阿拉伯数字转换成中文大写

    题:输入一个数字,转换成中文大写的写法 可运行的程序(Python 2.7.9): 1 #-*- coding: utf-8 -*- #在python2的py文件里面写中文,必须要添加一行声明文件编码 ...

  9. 阿拉伯数字转换成中文或中文大写

    第一种,数字转换成中文,在网上查的版本比如13,转换完成就变成一十三,非常之苦恼,经过我的一番搜查之后,发现在这个JS写的很完美,所以收藏以备后用! 先上效果图(不会显示一十三哦) 直接上代码,转载过 ...

最新文章

  1. the resource is not on the build path of a java project
  2. python简单代码画图-Python科学画图代码分享
  3. kthread_work和kthread_worker机制
  4. ASP.NET .Net UCS2 加码最复杂的方法
  5. 任意阶魔方阵matlab程序,【精品】任意阶魔方阵算法(c语言)
  6. 机器学习系列(九)【最大熵模型】
  7. 如何将数据渲染到页面上?
  8. 不恢复余数除法原理_义务教育第一学段中七个除法相关概念的一种理解
  9. 大学生个人网页模板 简单网页制作作业成品 极简风格个人介绍HTML网页设计代码下载
  10. 千千音乐付费音乐爬取--json数据的处理
  11. 制造业案例 | 美创助力纳爱斯集团三层业务安全审计实践
  12. 优雅使用Jsdelivr/CDN加速博客访问速度
  13. Python 读取mgf文件
  14. H2O技术方案预研分析
  15. data guard汇总(1)
  16. 微信公众号运营外包价格是多少?
  17. sublime 集成 markdown 插件【小明同学】
  18. CSS中div的边框
  19. 微信小程序内添加腾讯地图 导航
  20. Python字典遍历

热门文章

  1. 高清画质,语音降噪,简单易用-QVE屏幕录制
  2. 这一次,北京上海被群殴了!!
  3. 淘宝数据包转ECSHOP数据包的操作步骤
  4. 192.168.1.198接口地址
  5. 【jq】JQuery对select的操作
  6. Unity绳子/绳索效果
  7. ChatGPT 爆红后,估值 290 亿美元的 Open AI 要被收购?
  8. Black Cat有声名著【1】1 Peter Pan 彼得.潘 【故事介绍】
  9. 基于Qt Phonon模块实现音乐播放器
  10. 长亭科技 Go 后端开发实习生一面面经