zhangjinxuan 发表于 2023-5-19 19:50:39

一个简单的读数程序(真读数!)

本帖最后由 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 = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
const char* b = {"十", "百", "千"};
const char* g = {"万", "亿", "兆", "京", "垓", "秭", "穣", "沟", "涧", "正", "载", "极"};
char gs, num;
int len, gstot;

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

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

食用方法

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

sfqxx 发表于 2023-5-19 20:19:56

{:7_146:}

liuhongrun2022 发表于 2023-5-20 08:52:48

{:10_275:}

元豪 发表于 2023-5-20 10:16:24

{:10_301:}
页: [1]
查看完整版本: 一个简单的读数程序(真读数!)