大写汉字转阿拉伯数字c语言,阿拉伯数字转中文数字方法详解(C++实现)

阿拉伯数字与中文数字没有一一对应关系,不存在直接转换的公式化算法,因此需要根据两种数字体系的特点精心构造转换算法。

中文计数有一个特点,就是“零”的使用变化多端。阿拉伯数字中数字的权位依靠数字在整个数字长度中的偏移位置确定,因此数字中间出现的0用于标记数字的偏移位置,即便是连续出现的0也不能省略。中文计数方式中每个数字的权位都直接跟在数字后面,因此代表连续出现的若干个0。

尽管如此,也不是所有的情况都使用“零”,比如阿拉伯数字 20001234,中文数字表示为“二千万一千二百三十四”,没有用一个“零”;再比如阿拉伯数字 12000,中文数字表示为“一万二千”,也没有用“零”;但是对于阿拉伯数字 10210300,中文数字表示为“一千零二十一万零三百”,两次出现“零”。

针对这种情况,中文数字对“零”的使用总结起来有以下三条规则:

以 10000 为小节,小节的结尾即使是 0,也不使用“零”。

小节内两个非 0 数字之间要使用“零”。

当小节的“千”位是 0 时,若本小节的前一小节无其他数字,则不用“零”,否则就要用“零”。

从阿拉伯数字到中文数字的转换,第一步是以“万”为单位分节,并确定节权位。第二步是对每小节内的数字确定权位,并按照前面的三种方法处理“零”的问题:

一个转换示例

以阿拉伯数字 200001010200 为例,首先以“万”为单位对其分节,可分为三节:2000 0101 0200:

第一节 2000,节权位是“亿”,因为这一节的 0 都在结尾,根据规则 1,此处不使用“零”,直接表示为“二千亿”。

第二节 0101,节权位是“万”,因两个 1 之间有 0,根据规则 2,101 可以描述为“一百零一”。另外,此节的千位是 0,根据规则 3,因本小节前还有数字,因此需要用“零”。也就是说,本小节需要两个“零”。

最后一个小节,结尾的两个 0 根据规则 1,不使用“零”,但是千位的 0 根据规则 3,需要使用“零”。

根据以上分析,将三个小节的转换结果组合在一起,阿拉伯数字 200001010200 的中文表示就是“二千亿零一百零一万零二百”。

从这个例子可以看出来,对阿拉伯数字分节,确定数字的权位很简单,最难处理的就是 0 的转换,需要根据三个规则灵活选择是否需要使用“零”。

转换算法设计

设计阿拉伯数字转中文数字的算法,也可以遵循上例中的两个步骤来处理,但是需要解决三个问题。

第一个问题是单个数字的转换,这个并不难,因为阿拉伯数字 0〜9 与相应的中文数字是一一对应的。对这个转换设计算法非常简单,可以定义中文数字表:

const char *chnNumChar[CHN_NUM_CHAR_COUNT] = {"零","一","二","三","四","五","六","七","八","九"};

待转换的阿拉伯数字作为const char *chnUnitSection[] = {"万","亿","万亿"};

对于 32 位正数能表达的最大数来说,最大节权是“万亿”己经足够了,如果要转换更大的数,可以延伸这个节权表的定义,比如增加“亿亿”。数字中最低的节没有节权,使用空字符const char *chnUnitChar[] = {"十","百","千"};

最低位的权位是空字符串,处理方式和节权位的处理方式一样。数字权位的确定并不困难,通过移位就可以确定每个数字对应的权位。阿拉伯数字的权位是隐含在数字的位数中的,使用 0 作为占位符。比如数字 1000,要使1处在千位,一定会补 3 个 0 作为占位符,否则1就不代表“一千”。

既然每一位的权都在固定的位置上,只要记录移位的次数就可以确定阿拉伯数字的权位,以移位次数做下标,直接查 chnUnitSection 和 chnUnitChar 表就可以得到正确的中文数字的权位。

第三个需要解决的问题是如何处理中文“零”。这个问题稍微有点困难,需要根据文章开头给出的三个规则灵活判断,此外,对于连续出现的阿拉伯数字 0,也只能用一个中文“零”。

算法实现

转换算法首先要对阿拉伯数字分节,并确定节权位名称。num 对 10000 取模可得到一个 section,将这个 section 转成中文数字,然后根据节的位置补上节权位,即可完成一个节的中文数字转换。重复这个过程,直到 num 等于 0 为止,整个转换就算完成。

unitPos 变量记录节的位置,0 对应空字符串,1 对应“万”,2 对应“亿”,随着 unitPos 的增加,节权位也越来越大。全 0 的节不需要节权位,这个在代码中也有处理。根据规则 3 的定义,如果一节内数字的千位是 0,需要根据前面是否还有数字决定是否需要加“零”,NumberToChinese() 函数中利用变量 needZero 和 while(num > 0) 循环语句,巧妙地做了这个加“零”处理,省去了一个if判断。

//num == 0需要特殊处理,直接返回"零"

void NumberToChinese(unsigned int num, std::string& chnStr)

{

int unitPos = 0;

std::string strIns;

bool needZero = false;

while(num > 0)

{

unsigned int section = num % 10000;

if(needZero)

{

chnStr.insert(0, chnNumChar[0]);

}

SectionToChinese(section, strIns);

/*是否需要节权位? */

strIns += (section != 0) ? chnUnitSection[unitPos] : chnUnitSection[0];

chnStr.insert(0, strIns);

/*千位是0需要在下一个section补零*/

needZero = (section < 1000) && (section > 0);

num = num / 10000;

unitPos++;

}

}

SectionToChinese() 函数将一个节的数字转换成中文数字,利用中文数字表 chnNumChar 转换中文数字,利用表 chnUnitChar 得到数字权位,unitPos 变量用作权位索引。SectionToChinese() 函数的关键部分是对 0 的处理,根据规则 1 和规则 2,小节结尾的 0 不需要转换成“零”,但是两个数字之间的 0 需要转换成“零”。如果两个数字之间有 多个 0,也只转换一个“零”,变量 zero 用于控制“零”的转换,避免出现多个“零”连在一起的情况。

void SectionToChinese(unsigned int section, std::string& chnStr)

{

std::string strIns;

int unitPos = 0;

bool zero = true;

while(section > 0)

{

int v = section % 10;

if(v == 0)

{

if( (section ==0) || Izero )

{

zero = true; /*需要补,zero的作用是确保对连续的多个,只补一个中文零*/

chnStr.insert(0, chnNumChar[v]);

}

}

else

{

zero = false; //至少有一个数字不是

strIns = chnNumChar[v]; //此位对应的中文数字

strIns += chnUnitChar [unitPos]; //此位对应的中文权位

chnStr.insert(0, strIns);

}

unitPos++; //移位

section = section / 10;

}

}

中文大写数字

中文数字还有一个很有意思的现象,就是中文数字大写。所谓的大写其实就是用一些笔画复杂的汉字代替简单的数字汉字,其目的就是为了保证其不容易被篡改。中文大写用“壹贰叁肆伍陆柒捌玫”代替“一二三四五六七八九”,用“拾佰仟”代替“十百千”。这些数字的繁写其实在唐代就己经出现,但正式作为记载钱粮、税收等项目用的官方数字,是在明朝初年著名的“郭桓案”之后。

郭桓案:与空印案、胡惟庸案和蓝玉案一起并称为明初四大案。郭桓案发生在明朝洪武十八年(1385年),属于官吏贪污案件。户部侍郎郭桓等人,串通地方官吏作弊,篡改账册,私吞太平、镇江等府的赋税,还盗卖官粮。后被揭发,以其涉案金额巨大,对经济领域影响深远而为世人瞩目,对此,明太祖将六部左、右侍郎以下官员全部处死,地方官吏死于狱中者达数万人以上。为了追赃,牵连到全国各地的小富百姓,遭到抄家破产的不计其数。由于牵扯面 广,全国百姓对此案非常不满意,明太祖为了平息民怨,将审刑官吴席等人也一并处死。

实现中文大写数字的转换,只需要将 chnNumChar、chnUnitSection 中的中文数字和权位名称替换成大写数字就可以了,转换算法是一样的。如果用于人民币记账,可调整节权位的名称,加上“圆”或“圆整”等权名,有兴趣的读者可自行完成转换代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 自定义progressbar demo,Android 自定义进度条ColorfulProgressbar,原理简单、效果还行...

效果图&#xff1a;demo效果演示演示Demo特性与原生Progress相比&#xff0c;感觉更漂亮一点&#xff0c;可以显示进度值&#xff0c;背景凹凸感明显&#xff0c;进度条效果更加立体。原理说明额&#xff0c;挺简单的。不过感觉我的做法有点复杂了&#xff0c;我先自定义了一个…

android os自动安裝软件,[图]Bliss OS 12进入开发阶段:可在桌面设备上安装Android 10系统...

此外还对电池进行了优化&#xff0c;添加了额外的安全性选项和相关功能&#xff0c;支持大部分主流游戏手柄&#xff0c;兼容ARM / ARM64应用程序。目前Bliss OS 12已经进入早期开发阶段&#xff0c;有望让您在PC上运行最新的Android 10移动操作系统。Bliss OS开发人员说&#…

android安装eclipse插件,Android SDK安装及Eclipse插件安装.pdf

Android SDK 安装不 Eclipse 插件安装工具的下载开发 Android 需要用到的工具有&#xff1a;集成开发环境 Eclipse &#xff0c;Android 的 SDK 以及Java SDKAndroid SDK 下载地址 &#xff1a;/sdk/index.html点击上图中的红色地址就可以下载Eclipse 下载地址&#xff1a;/dow…

android 添加随意拖动的桌面悬浮窗口,android 添加随意拖动的桌面悬浮窗口

用过新版本android 360手机助手都人都对 360中只在桌面显示一个小小悬浮窗口羡慕不已吧&#xff1f;其实实现这种功能&#xff0c;主要有两步&#xff1a;1.判断当前显示的是为桌面。这个内容我在前面的帖子里面已经有过介绍&#xff0c;如果还没看过的赶快稳步看一下哦。2.使用…

android+版本升级的时候会清楚数据马,android主进程销毁了,线程会不会也销毁?...

Android Activity 销毁后子线程会不会被GC回收曾想当然地认为页面被finish之后线程会被android 虚拟机的垃圾回收机制回收掉。于是用页面跳转做测试测试代码结果有点意外&#xff0c;页面被销毁后定时器依然在执行。退出应用定时器还在执行。UI线程被结束掉&#xff0c;UI线程里…

mate7安装android o,华为Mate7升级安卓6.0详细教程

来讲一下华为Mate7升级安卓6.0(EMUI4.0)M版本详细图文教程吧&#xff0c;新的一年了&#xff0c;大家都迫不及待的想升级一下EMUI4.0&#xff0c;但是很多朋友都不知道怎样来升级&#xff0c;下面刷机网小编就来给大家仔细说一说吧&#xff0c;教程都在下面己经整理好了&#x…

html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放

我有body {background: url(images/background.svg);}期望的效果是该背景图像的宽度等于页面的宽度&#xff0c;高度变化以保持比例。 例如 如果原始图像恰好是100 * 200(任何单位)且正文宽度为600px&#xff0c;则背景图像最终应为1200px高。 如果调整窗口大小&#xff0c;高度…

html定位的所有属性,HTML CSS定位属性详解 嘿嘿嘿

定位属性&#xff1a;Position作用&#xff1a;检索或者设置元素的定位方式“(改变元素位置)定位的步骤&#xff1a;1.给元素添加position属性 证明该元素要做位置变2.确定参照物&#xff01;(通过position的属性值来确定 )3.确定坐标 left right top bottomPosition的属性值&a…

html中表格与字对齐,html – 中心与表格单元格对齐

这是一个很好的起点。HTML&#xff1a;CSS&#xff1a;.containing-table {display: table;width: 100%;height: 400px; /* for demo only */border: 1px dotted blue;}.centre-align {padding: 10px;border: 1px dashed gray;display: table-cell;text-align: center;vertical…

postman响应html,Postman工具——请求与响应(示例代码)

两个内容&#xff1a; Request 请求和 Response 响应&#xff0c;下面就开始了。一、Request 请求Request 请求&#xff0c;我们只介绍常用的四种&#xff1a;GET、POST、PUT、DELETE&#xff0c;其他类型的就不展开介绍了。另外&#xff0c;我们今天测试的项目是基于 RESTful …

2021高考无准考证成绩查询,2021考研没有准考证号怎么查成绩

2021考研没有准考证号怎么查成绩2020-12-10 11:02:14文/徐克达考研初试结束后&#xff0c;大家最关心的就是成绩的事情了&#xff0c;那么考研没有准考证号怎么查成绩呢&#xff1f;下面是小编整理的详细内容&#xff0c;一起来看看吧&#xff01;考研没有准考证号查成绩的方法…

c++ 如何确认网卡为无线网卡_笔记本无线网卡有哪几种 有必要升级吗

无线网卡是很多朋友购买笔记本时容易忽视的部分&#xff0c;相比较处理器、内存、显卡和硬盘&#xff0c;无线网卡几乎不可选&#xff0c;而且很少有厂商提到自家产品采用的无线网卡型号。大家可能遇到过这种情况&#xff1a;为什么手机可以连接到5Ghz&#xff0c;而自己的笔记…

计算机网络专业运动会入场式,运动会入场式解说词(精选10篇)

运动会入场式解说词(精选10篇)在学习、工作生活中&#xff0c;接触并使用解说词的人越来越多&#xff0c;解说词是依靠文字来对事物、事件或人物进行描述的口头说明解说的词。大家知道解说词的格式吗&#xff1f;以下是小编精心整理的运动会入场式解说词(精选10篇)&#xff0c;…

gifcam使用缩小内存_Fedora 上的桌面环境内存占用测试 | Linux 中国

通常&#xff0c;根据功能、外观和其它品质&#xff0c;选择桌面是一件非常个人的偏好。但有时&#xff0c;你选择的桌面环境还会受到硬件限制。-- Troy DawsonFedora 中有 40 多种桌面环境(DE)。每种桌面环境都有自己的优点和缺点。通常&#xff0c;根据功能、外观和其它品质&…

优秀自我简介200字_全球战疫 翰墨传情——东方盛世杯网络公益书画展优秀作品【二】...

​本文纯手打原创&#xff0c;转发请标注出处&#xff01;中国书画爱好者&#xff0c;是中华优秀传统文化的薪火传承者。他们用生命中最美好的时光与最深沉的情感&#xff0c;实践着伟大文化复兴而不自知。——书画家网经过评委的精心评选&#xff0c;“东方盛世杯”2020网络公…

html渐变编织背景,【报Bug】uniapp设置了css渐变背景色编译时会报错

详细问题描述css样式中设置了背景色的话在H5发行编译时会报错&#xff0c;不过在浏览器运行编译时未发生错误。错误日志&#xff1a;[HBuilder] 15:14:32.364 Module build failed (from ./node_modules/postcss-loader/src/index.js):[HBuilder] 15:14:32.365 TypeError: Cann…

fi sap 凭证冲销 稅_SAP 成本收集器与重复制造配置手册

1&#xff0e;检查产品成本收集器的评估变式OPN22&#xff0e;检查产品成本收集器的成本核算变式OKKN3&#xff0e;确定作业数量的成本核算变式4&#xff0e;内部作业估价的成本核算变式5&#xff0e;定义订单交货的货物接收评估6&#xff0e;定义利润分析码OKG17&#xff0e;定…

要怎么在计算机里清除桌面内存,电脑内存不足怎么办?怎么清理电脑内存?

当电脑内存不足&#xff0c;内存占用高&#xff0c;磁盘空间不够时&#xff0c;我们该如何对电脑进行清理呢&#xff1f;今天我们就一起来看看清理电脑内存的方法&#xff01;一、结束进程中占用内存高的软件1.使用电脑组合键【CtrlShiftEsc】调出任务管理器&#xff0c;在【进…

python制作加密工具_Python制作钉钉加密/解密工具

又是很久没有写技术博客了&#xff0c;盖因最近都在学习知识&#xff0c;也没有总结出什么值得分享的内容&#xff0c;所以一直停笔至今。最近的工作和钉钉的开发打上了交到&#xff0c;官方并没有提供任何Python的SDK&#xff0c;于是只能全部自己写。现在我将其中实现起来相对…

计算机专业英语第07章,计算机专业英语 -第7章1.ppt

计算机专业英语 -第7章1Chapter 7 Input and Output Introduction Do you ever wonder how information gets into your computer and comes out in a form you can use? Input devices convert what we understand into what the system unit can process. Output devices co…