鱼C论坛

 找回密码
 立即注册
查看: 1294|回复: 3

[技术交流] 一个简单的读数程序(真读数!)

[复制链接]
发表于 2023-5-19 19:50:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjinxuan 于 2023-6-25 18:33 编辑

一个简单的读数程序


设计目的

众所周知,小学数学老师经常让我们读数。

如 一十一万四千五百一十四 (114514),一百九十一万九千八百一十 (1919810)。

于是乎,我就有了一个想法,我们自己来做一个读数程序!

效果展示

输入 #1
1412600000

输出 #1
一十四亿一千二百六十万

输入 #2
8032122420

输出 #2
八十亿三千二百一十二万二千四百二十

输入 #3
6259910842056661784810976479669330393482

输出 #3
六千二百五十九涧九千一百零八沟四千二百零五穣六千六百六十一秭七千八百四十八垓一千零九十七京六千四百七 十九兆六千六百九十三亿三千零三十九万三千四百八十二

实现方法

这个想法听上去很疯狂,但其实上很简单。

小学数学老师教过,我们可以分级。

因此,我们只需要分级,然后对于每一级都输出一遍,再用 万,亿,兆 等单位来连接即可。
#include <bits/stdc++.h>
using namespace std;

const char* n[10] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
const char* b[3] = {"十", "百", "千"};
const char* g[20] = {"万", "亿", "兆", "京", "垓", "秭", "穣", "沟", "涧", "正", "载", "极"};
char gs[20][6], num[20];
int len, gstot;

const string grade(const char *s, bool first) {
        if (s[0] == s[1] && s[1] == s[2] && s[2] == s[3] && s[2] == '0') return "";
        char r[20] = {}, len = 0;
        int i;
        bool nd = 0;
        for (i = 0; i < 4; ++i) {
                if (s[i] == '0') {
                        bool end0 = 1;
                        for (int j = i + 1; j < 4; ++j) {
                                if (s[j] != '0') end0 = 0;
                        }
                        if (end0) break;
                        for (; i < 4; ++i) {
                                if (s[i] != '0') break;
                        }
                        --i;
                        if (first && !nd) continue;
                        sprintf(r + len, "%s", n[0]);
                        len += strlen(n[0]);
                } else {
                        nd = 1;
                        sprintf(r + len, "%s", n[s[i] - '0']);
                        len += strlen(n[s[i] - '0']);
                        if (i != 3) {
                                sprintf(r + len, "%s", b[2 - i]);
                                len += strlen(b[2 - i]);
                        }
                }
        }
        return (string)r;
}

int main() {
        scanf("%s", num + 1);
        len = strlen(num + 1);
        if (len == 1 && num[1] == '0') {
                puts("零");
                return 0;
        }
        int tmp = len % 4;
        if (tmp != 0) {
                gstot = 1;
                for (int i = 1; i <= 4 - tmp; ++i) {
                        gs[gstot][i - 1] = '0';
                }
                for (int i = 1; i <= tmp; ++i) {
                        gs[gstot][4 - i] = num[tmp - i + 1];
                }
        }
        int t = 0;
        for (int i = tmp + 1; i <= len; ++i) {
                if (t % 4 == 0) {
                        t = 0;
                        ++gstot;
                }
                gs[gstot][t++] = num[i];
        }
        for (int i = 1; i <= gstot; ++i) {
                printf("%s", grade(gs[i], i == 1).c_str());
                if (i != gstot) printf("%s", g[gstot - i - 1]);
        }
        puts("");
        return 0;
}

食用方法

输入一个 0~ 1040 以内的数,然后程序就会输出这个数字的读法。

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
歌者文明清理员 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-19 20:19:56 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 08:52:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 10:16:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 15:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表