02-算法的乐趣-阿拉伯数字与中文数字转换算法
来源:互联网 发布:网络棋牌游戏赚钱吗 编辑:程序博客网 时间:2024/06/13 06:05
根据《算法的乐趣》简单总结一下:
中文数字的特点
中文数字直接“数字+权位”的方式组成数字,比如阿拉伯数字100,中文表示为一百,其中“一”为数字,“百”为权位。常用的数字权位有“十”,“百”,“千”,“万”,“亿”等
中文数字的权位和小节
中文数字的特点之一就是每个计数数字都跟着一个权位,这个权位就是数字的量值,相当于阿拉伯数字中的数位。最低位(个位)没有权位,也可以理解为权位为空
中文数字的另一个特点是以“万”为小节(欧美习惯以“千”为小节),每一个小节都有一个节权位,万以下的没有节权位(或节权位为空),万以上的就是万,再大的就是“亿”,每个小节内部都以“十百千”为权位的独立计数。“十百千”这几个权位是不能连续出现的,如二十百,一千千,但万和亿作为节权位却可以和其他权位一起使用,如二十亿等中文数字的零
中文对零的使用总结有以下三条:
规则1:以10000为小节,小节的结尾即使是0,也不使用“零”。
规则2:小节内两个非0数字之间要使用“零”。
规则3:当小节的“千”为是0是,若本小节的前一小节无其他数字,则不用“零”,否则用“零”。
阿拉伯数字转中文数字
第一步是以“万”为单位分节,并确定节权位。第二步是对每小节内的数字确定权位,并按照上面的三条规则处理“零”的问题
- 转换算法设计
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int CHN_NUM_CHAR_COUNT = 10;//单个数字对应的中文汉字const char *chnNumChar[CHN_NUM_CHAR_COUNT] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};//小节位,对32位正数表达的最大整数来说,最大节权万亿就够了const char *chnUnitSetion[] = {"", "万", "亿", "万亿"};//每个小节里面的独立计数const char *chnUnitChar[] = {"", "十", "百", "千"};void NumberToChinese(unsigned int num, string &chnStr);//每个小节内单独处理void SectionToChinese(unsigned int section, string &chnStr);int main() { unsigned int num; string str="请输入"; cout<<str<<endl; while (cin >> num && (num != 0)) { string chnStr=""; NumberToChinese(num, chnStr); cout<<chnStr<<endl; } return 0;}void NumberToChinese(unsigned int num, string& chnStr) { int unitPos = 0; //小节的位置 bool needZero = false; //初始默认规则3不需要0 while (num > 0) { string strIns=""; unsigned int section = num % 10000; if (needZero) { //满足规则3需要添零,根据后面的语句是否修改了needZero来检测是否添加0 chnStr.insert(0, chnNumChar[0]); } SectionToChinese(section, strIns);// 检测当前section的的是否是0,如果是0的话,则添加空字符串的节权位,否则添加其他的 strIns += (section != 0) ? chnUnitSetion[unitPos] : chnUnitSetion[0]; chnStr.insert(0, strIns);// 当满足小节内的值小于1000且值大于0的时候表示当前小节的千位是一个0,如果前面一小节还有值的时候则添0 needZero = (section < 1000) && (section > 0); num /= 10000; unitPos++; }}void SectionToChinese(unsigned int section, string &chnStr) { string strIns="";// 当前小节内的当前个数的独立计数的权位 int unitPos = 0;// 先设置zero为true,为了测试规则二,两个相连的0只留一个 bool zero = true; while (section > 0) { int v = section % 10; if (v == 0) {// 当不是两个0相连的时候或者 添加0在数字中 if (!zero) {// 当出现一个0的时候就设置zero为true,当下一个还是0的时候就不添加0了 zero = true; chnStr.insert(0, chnNumChar[v]); } } else {// 当出现一个不是0的数字的时候就设置当前的zero标志为false表示下次遇到0的时候还是要添加 zero = false; strIns = chnNumChar[v]; strIns += chnUnitChar[unitPos];// 将这个strIns插入到总的字符串的开始的位置 chnStr.insert(0, strIns); }// 权位增加 unitPos++;// 小节值除以10 section /= 10; }}
运行测试:
0 0
- 02-算法的乐趣-阿拉伯数字与中文数字转换算法
- 转换算法(中文数字转阿拉伯数字)
- 把一个阿拉伯数字转换成中文数字的算法
- 中文数字与阿拉伯数字间的转换
- 阿拉伯数字与中文数字的相互转换
- 阿拉伯数字与中文数字的转换----------相互转化
- 阿拉伯数字 转换为 汉字数字 算法实现
- 一个将阿拉伯数字转换成中文大写的算法[C#]
- 一个中文数字转换阿拉伯数字的脚本
- 对一个罗马数字与阿拉伯数字转换算法的分析
- Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换。
- Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换
- PHP阿拉伯数字与中文数字的转换(数字的读写)
- 阿拉伯数字与中文转换
- 汉字数字与阿拉伯数字的转换
- 阿拉伯数字转换为中文数字
- 阿拉伯数字转换为中文数字
- 中文数字转换成阿拉伯数字。
- wxpthon 控件编程
- Ajax和jQuery
- Java中的volatile关键字
- 获取系统信息
- 简单写写二叉树的添加功能,中序遍历,最小值和查询功能
- 02-算法的乐趣-阿拉伯数字与中文数字转换算法
- OJ HDU_2502_月之数
- NoSQL Manager for MongoDB 破解
- 快速排序
- 立即停止Android Studio 编译
- DNS劫持
- tomcat6关于el表达式的一大坑!
- Java虚拟机2
- VUE:跨域设置