马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zhangjinxuan 于 2023-6-25 18:33 编辑
一个简单的读数程序
设计目的
众所周知,小学数学老师经常让我们读数。
如 一十一万四千五百一十四 (114514),一百九十一万九千八百一十 (1919810)。
于是乎,我就有了一个想法,我们自己来做一个读数程序!
效果展示
输入 #1
输出 #1
输入 #2
输出 #2
输入 #36259910842056661784810976479669330393482
输出 #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 以内的数,然后程序就会输出这个数字的读法。
|