数的读法 (模拟)

Description

Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:
十二亿三千四百五十六万七千零九
用汉语拼音表示为
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
这样他只需要照着念就可以了。
你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。

Input

有一个数字串,数值大小不超过2,000,000,000。

Output

是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。

Sample Input

1234567009

Sample Output

shi er yi san qian si bai wu shi liu wan qi qian ling jiu

题意很简单,耐心分析,然后模拟就完事了。

可以发现将每四位分成一组,中间用亿、万连接起来比较简便。

将分好的四位一组的数每一位分别判断一下

十位为1时根据百位的情况有shi、yi shi两种可能,比如1011是:yi qian ling shi yi,而不是yi qian ling yi shi yi

注意 ling 和 空格 的输出

不确定的读音可以去这个在线网站查一下:

http://www.nicetool.net/embed/number_to_chinese.html

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <string>
  5 #include <math.h>
  6 #include <algorithm>
  7 #include <vector>
  8 #include <stack>
  9 #include <queue>
 10 #include <set>
 11 #include <map>
 12 #include <sstream>
 13 const int INF=0x3f3f3f3f;
 14 typedef long long LL;
 15 const int mod=1e9+7;
 16 const int maxn=1e4+10;
 17 using namespace std;
 18
 19 map<int,string> mp;
 20
 21 int main()
 22 {
 23     #ifdef DEBUG
 24     freopen("sample.txt","r",stdin);
 25     #endif
 26
 27     mp[0]="ling";mp[1]="yi"; mp[2]="er"; mp[3]="san"; mp[4]="si"; mp[5]="wu";
 28     mp[6]="liu"; mp[7]="qi"; mp[8]="ba"; mp[9]="jiu"; mp[10]="shi";
 29
 30     int n;
 31     cin>>n;
 32     int t,a,b,c,d;
 33     int f1=0,f2=0;
 34     if(n>=100000000)//处理"亿"之前
 35     {
 36         f1=1;
 37         t=n/100000000;
 38         a=t/10;
 39         b=t%10;
 40         if(a)
 41         {
 42             if(a>1) cout<<mp[a]<<" ";
 43             cout<<"shi";
 44             if(b) cout<<" "<<mp[b];
 45         }
 46         else cout<<mp[b];
 47         cout<<" "<<"yi";
 48         if(n%100000000) cout<<" ";//如果后面不为0,分隔
 49     }
 50     if(n%100000000>=10000)//处理"万"之前
 51     {
 52         f2=1;
 53         t=(n%100000000)/10000;
 54         a=t/1000;
 55         b=t%1000/100;
 56         c=t%100/10;
 57         d=t%10;
 58         if(a)
 59         {
 60             cout<<mp[a]<<" qian";
 61             if(b||c||d) cout<<" ";
 62         }
 63         else if(f1) cout<<"ling ";
 64         if(b)
 65         {
 66             cout<<mp[b]<<" bai";
 67             if(c||d) cout<<" ";
 68         }
 69         else
 70         {
 71             if((a&&c)||(a&&d)) cout<<"ling ";
 72         }
 73         if(c)
 74         {
 75             if(c>1) cout<<mp[c]<<" ";
 76             cout<<"shi";
 77             if(d) cout<<" ";
 78         }
 79         else
 80         {
 81             if(b&&d) cout<<"ling ";
 82         }
 83         if(d) cout<<mp[d];
 84         cout<<" "<<"wan";
 85         if(n%10000) cout<<" ";//如果后面不为0,分隔
 86     }
 87     if(n%10000)
 88     {
 89         t=(n%10000);
 90         a=t/1000;
 91         b=t%1000/100;
 92         c=t%100/10;
 93         d=t%10;
 94         if(a)
 95         {
 96             cout<<mp[a]<<" qian";
 97             if(b||c||d) cout<<" ";
 98         }
 99         else if(f2) cout<<"ling ";
100         if(b)
101         {
102             cout<<mp[b]<<" bai";
103             if(c||d) cout<<" ";
104         }
105         else
106         {
107             if((a&&c)||(a&&d)) cout<<"ling ";
108         }
109         if(c)
110         {
111             if(c>1) cout<<mp[c]<<" ";
112             cout<<"shi";
113             if(d) cout<<" ";
114         }
115         else
116         {
117             if(b&&d) cout<<"ling ";
118         }
119         if(d) cout<<mp[d];
120     }
121     cout<<endl;
122
123     return 0;
124 }

我写的有点麻烦,推荐一篇写法简洁的博客:

https://blog.csdn.net/weixin_43804406/article/details/104126113

-

原文地址:https://www.cnblogs.com/jiamian/p/12286004.html

时间: 2024-10-17 08:20:45

数的读法 (模拟)的相关文章

[BASIC-20] 数的读法

基础练习 数的读法 时间限制:1.0s   内存限制:512.0MB 问题描述 Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿. 比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的. 所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法: 十二亿三千四百五十六万七千零九 用汉语拼音表示为 shi er yi san qian

蓝桥杯_基础训练_数的读法

有点恶心的一道题,做了整整半天才完全对. 思路: 把输入的数从右往左每4位进行分割.然后判断单位级数,输出即可. #include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { string a; string num[]={"ling ","yi ","er ","san &q

数的读法

问题描述 Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿. 比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的. 所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法: 十二亿三千四百五十六万七千零九 用汉语拼音表示为 shi er yi san qian si bai wu shi liu wan qi qian ling

蛇形填数和蛇形取数(基础模拟练习)

1 /* 2 问题 输入矩阵的规模n,先将数按照下,右,上,左的顺序填入矩阵,再按照这样的顺序取出. 3 解题思路 模拟,按照笔的顺序存入取出,注意初始化的时候一定将矩阵全部初始化. 4 */ 5 #include<cstdio> 6 #include<cstring> 7 const int N=1001; 8 int a[N][N],b[N][N]; 9 int main() 10 { 11 int n,i,j,tot,x,y; 12 while(scanf("%d&

H.数7(模拟)

1212: H.数7 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 5 标签提交统计讨论版 题目描述 数7是一个简单的饭桌游戏,有很多人围成一桌,先从任意一人开始数数,1.2.3……那样数下去,逢到7的倍数(7.14.21……)和含有7的数字(17.27……)必须以敲桌子代替.如果有谁逢7却数出来了,就要接受惩罚.小明觉得这个游戏太简单了,于是对它做出了改进,那就是每逢到素数的时候就以敲桌子代替,并且数数的方向发生改变,而且最开始的那个人可以从1到10000中选一个合数

洛谷 P1308 统计单词数【字符串+模拟】

P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章 中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 ). 输入输出格式 输入格式: 输入文件

[CSP-S模拟测试]:简单的填数(贪心+模拟)

题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1}\leqslant a_i+1$且$a_{i+1}$为正整数·对于任意在$a$中出现过的数$v$,记它的出现次数为$s$,则$2\leqslant s\leqslant 5$给定一个长度为$n$的序列$a$,其中有一些位置为$0$,你需要在这些位置上任意填数,使得$a$成为一个合法的序列,并且最大

2019合工大共创五套卷(数一数二数三)模拟卷一+答案PDF

资源链接:https://pan.baidu.com/s/1SVQJDfXmVt6u0xJhFPgC3Q合工大共创考研数学模拟卷,冲刺复习经典必备.数学1和3都是每年五套题,数学2每年只有三套题.现更新数一数二数三的模拟卷一,分享给大家!如下: 原文地址:http://blog.51cto.com/14093933/2325032

寻找ROS取数的瓶颈:思路整理

整个数据流要做的事情:先找到整个取数流程瓶颈所在,然后在造成瓶颈的部分进行优化. 有下面几个问题: 1.瓶颈分为硬件上的和软件上的.我要找的是软件上瓶颈.所以要先知道硬件的实际能力. 于是需要:对已知的机器做性能测试,知道能跑出多少带宽,用来与ROS的取数带宽做对照,如果没达到这个测试出来的带宽,就代表软件上哪里有瓶颈. 这一部分就是之前做的:不带组装时,在cmm03刀片上,iperf测试与ROS测试的对比.然而,对比的结果如何呢?这一部分有瓶颈吗?我是咋做的对照? 咋做的分析?我咋都忘了呢?