作者cutekid (可爱小孩子)
看板C_and_CPP
标题Re: [问题] c 数字转国字
时间Sat Jun 2 15:21:40 2018
程式码:
http://codepad.org/XmQgTW3H
想法:
1. 把印「数字」跟印「单位」拆开
2. 把是否补零放在印「数字」处理(用一个 zero flag 协助判断)
3. 把印单位分成二部份:
3.1 十、百、仟: 当前数字不为 0 时,直接输出单位
3.2 万、亿: 用一个 msb flag 协助判断是否输出单位
4. 单独处理只有 0 的 case
※ 引述《a346571358 (风吹谁懂)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: win8
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: GCC
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: stdio.h
: 问题(Question):
: 如何显示成 平常国字标准数字念法
: 末几位是0 不显示
: 从最左边起 遇到大於等於一个0
: 只显示一个零
: 喂入的资料(Input):
: 42002500
: 预期的正确结果(Expected Output):
: 肆仟贰百万贰仟五百元
: 错误结果(Wrong Output):
: 肆仟贰百零零贰百五十零元
: 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
: https://ideone.com/XnET5L
: #include <stdio.h>
: void p1(int);
: void p2(int);
: char *dig[] = {"零","壹","贰","参","肆","伍","陆","柒","捌","玖"};
: char *fer[] = {"\0","十","百","仟","万","十","百","仟","亿"};
: int times=0;
: int main()
: {
: int n;
: printf("N = ");
: scanf("%d",&n);
: p1(n);
: printf("元\n");
: return 0;
: }
: void p1(int n)
: {
: int prefix,curryDig;
: if( n < 10){
: printf("%s",dig[n]);
: p2(times);
: }
: else{
: prefix = n / 10;
: times++;
: p1(prefix);
: times--;
: curryDig = n % 10;
: if(curryDig == 0){
: int count = 0;
: while( prefix % 10 == 0){
: count++;
: prefix /= 10;
: times--;
: curryDig = prefix % 10;
: }
: if(times != 0)
: printf("%s",dig[0]);
: }
: else{
: printf("%s",dig[curryDig]);
: p2(times);
: }
: }
: }
: void p2(int times)
: {
: printf("%s",fer[times]);
: }
: 补充说明(Supplement):
: times当成从後面数来第几个
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.82.122.178
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1527911899.A.126.html
: 推 jerryh001: 开个阵列把国字结果存起来 然後把不要的部份去掉才输出 06/02 12:22
: → stupid0319: 我执行你的code得到肆仟贰百零零贰百伍十零元 06/02 12:25
: → a346571358: 也就是 我不要直接printf 而是存到新阵列里 去掉再印 06/02 12:26
: → a346571358: 阿 没有万 不好意思打错了 06/02 12:27
: ※ 编辑: a346571358 (111.82.122.178), 06/02/2018 12:27:54
: → stupid0319: 这个用递回来做感觉不太适合 06/02 12:30
: → a346571358: 那有什麽其他想法吗 欢迎告诉我 06/02 12:31
: → stupid0319: logical先列出来,什麽时候要零,什麽时候不要零 06/02 12:33
: → stupid0319: 什麽时候加万,什麽时候加亿,先列出来 06/02 12:34
: → MOONRAKER: 要递回也弄个储存空间吧 这会需要知道之前输出什麽 06/02 12:38
: → stupid0319: 你是Curry粉丝吗?命名要加强一下 06/02 12:38
: → MOONRAKER: 最起码要知道上一次输出什麽 06/02 12:39
: → a346571358: 关於储存空间是用一个变数 存进去吗 06/02 12:40
: → MOONRAKER: 复杂一点的自动机就有储存 但是一般写递回都不会强调 06/02 12:41
: → MOONRAKER: 储存空间比较正式的方法是宣告一个阵列或变数 每次递回 06/02 12:42
: → MOONRAKER: 一直把这个阵列或变数传下去 偷懒可以用全域变数 06/02 12:43
: → a346571358: 毕竟这个程式就是...一直印出 若改成把输出的值都存 06/02 12:43
: → a346571358: 到阵列里面 再用条件去限制这阵列来控制输出值呢 06/02 12:43
: → MOONRAKER: 照我看他有一个地方用到储存 就是上次有没有印出零 06/02 12:46
: → MOONRAKER: 如果上次是零这次还是零就不印出 利用储存会很好克服 06/02 12:47
: → a346571358: 我还是..先问一下怎麽用阵列存国字好了.. 06/02 13:04
: → a346571358: 没事 我现在已经都存在一个阵列了 不过那条件 06/02 13:11
: → longlongint: zerojudge 中文大写数字. 已废题但有参考资料 06/02 13:54
: → a346571358: 有办法传回来times回到main函数是对的值吗 06/02 14:08
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.223.60.145
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1527924102.A.9EA.html
1F:推 a346571358: 谢谢你...不过我刚刚也写完了 06/02 15:28
※ 编辑: cutekid (61.223.60.145), 06/02/2018 15:39:03