郑州轻工业学院(ZZULI) OJ系统第1431题 读数字 解题报告
2015-06-10 01:41
447 查看
试题
试题链接Description
以前比赛的时候大家最喜闻乐见的题目大概就是A+B了,但是现在的A+B一个比一个麻烦,基本上不带点儿进制转换数值处理什么的都不好意思说自己是A+B。A+B早已经不是简单的代名词了!今天,我们决定用一道新的题目来重新定义一下水题该有的样子,这道题目一定要比A+B更简单、更直白,让人看到之后不用计算随口就能把答案说出来!
这道题就是读数字!是的!你没看错!不是小明读数字!不是大明读数字!!更不是人见人爱读数字和火星读数字!
读入一个整数,然后请用汉语将它表示出来。比如对于10,请输出“十”(不含双引号),对于1234,输出“一千二百三十四”。
是不是很简单?是不是看到数据就不自觉地把答案念出来了?那还犹豫什么?赶紧A掉它吧!
Input
多组测试数据。每组测试数据包含一个整数n(0≤n<109)。Output
一串汉字Sample Input
15110100000
1010
Sample Output
十五一亿一千零一十万
一千零一十
试题大意
多组数据,每组数据输入一个小于 109 的正整数或0(阿拉伯数字,十进制),输出这个数字的中文名。例如输入12096,输出“一万二千零九十六”。复习小学数学
从右往左,每四位分一级,分别叫做“个级”、“万级”和“亿级”。含有个级、万级和亿级的数,必须先读亿级,再读万级,最后读个级。
亿级和万级的数都按个级的读数方法来读,在后面加上“亿”或“万”字。
在级末尾的“0”不读,在级中间的“0”必须读。中间不管连续有几个“0”,都只读一个“零”。
例如:
20020056789
第一步:分级
从右往左,每四位分一级。
200¦2005¦6789
第二步,每一级,都按个级来读数
亿级:二百
万级:二千零五
个级:六千七百八十九
第三步,亿级后加“亿”字,万级后加“万”字
二百亿二千零五万六千七百八十九
解题思路
直接模拟人工读数,先分级转汉字,每级后加“亿”或“万”字。每一级内,都按“几千几百几十几”的规则,有一个或多个“0”的,如果不在末尾,就读一个“零”。最后要注意的是:10至19如果出现在最高的数级,则读成“十”至“十九”,不要读成“一十”至“一十九”。但是出现在后面,则要读成“一十”至“一十九”。例如“190013”读做“十九万零一十三”。
源代码
/** * @file read_number.c * @author yjf_victor * @date 2015-06-09 * @brief http://acm.zzuli.edu.cn/problem.php?id=1431 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LENGTH 100 #define ONE_HUNDRED_MILLION "亿" #define TEN_THOUSAND "万" #define THOUSAND "千" #define HUNDRED "百" #define TEN "十" #define ONE_BEFORE_TEN "一十" const char *digit_chinese_name[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; enum need_zero_prefix {ERROR, NO_ZERO_PRIFIX, NEED_ZERO_PREFIX}; /** * @brief 单一数级中的数字的中文读法 * @param[out] chinese_name 中文读法 * @param[in] arabic_number 阿拉伯数字 * @return 可能需要补前导“零”,则返回NEED_ZERO_PREFIX, * 否则返回NO_ZERO_PRIFIX,出错返回ERROR */ enum need_zero_prefix arabic_to_chinese_below_ten_thousand( char *chinese_name, const char *arabic_number) { int value; char four_digit_number[5]; if (chinese_name == NULL || arabic_number == NULL) return ERROR; sscanf(arabic_number, "%04d", &value); sprintf(four_digit_number, "%04d", value); chinese_name[0] = '\0'; if (four_digit_number[0] == '0') { if (four_digit_number[1] == '0') { if (four_digit_number[2] == '0') { if (four_digit_number[3] != '0') { // 一位数 strcat(chinese_name, digit_chinese_name[four_digit_number[3] - '0']); } } else // 两位数 { // 读十位 strcat(chinese_name, digit_chinese_name[four_digit_number[2] - '0']); strcat(chinese_name, TEN); // 读个位 if (four_digit_number[3] != '0') { strcat(chinese_name, digit_chinese_name[four_digit_number[3] - '0']); } } } else // 三位数 { // 读百位 strcat(chinese_name, digit_chinese_name[four_digit_number[1] - '0']); strcat(chinese_name, HUNDRED); // 读十位 if (four_digit_number[2] == '0') { if (four_digit_number[3] != '0') strcat(chinese_name, digit_chinese_name[0]); } else { strcat(chinese_name, digit_chinese_name[four_digit_number[2] - '0']); strcat(chinese_name, TEN); } // 读个位 if (four_digit_number[3] != '0') { strcat(chinese_name, digit_chinese_name[four_digit_number[3] - '0']); } } return NEED_ZERO_PREFIX; } else // 四位数 { // 读千位 strcat(chinese_name, digit_chinese_name[four_digit_number[0] - '0']); strcat(chinese_name, THOUSAND); // 读百位 if (four_digit_number[1] == '0') { if (four_digit_number[2] != '0') strcat(chinese_name, digit_chinese_name[0]); } else { strcat(chinese_name, digit_chinese_name[four_digit_number[1] - '0']); strcat(chinese_name, HUNDRED); } // 读十位 if (four_digit_number[2] == '0') { if (four_digit_number[3] != '0') strcat(chinese_name, digit_chinese_name[0]); } else { strcat(chinese_name, digit_chinese_name[four_digit_number[2] - '0']); strcat(chinese_name, TEN); } // 读个位 if (four_digit_number[3] != '0') { strcat(chinese_name, digit_chinese_name[four_digit_number[3] - '0']); } return NO_ZERO_PRIFIX; } } /** * @brief 分级读数 * @details 分成“亿级”、“万级”和“个级”,读数后加上“亿”或“万”字 * @param[out] chinese_name 中文读法 * @param[in] value 需要被读的数值 * @return 成功返回0,失败返回-1 */ int value_to_chinese(char *chinese_name, int value) { char temp_chinese_name[MAX_LENGTH]; char arabic_number[MAX_LENGTH]; int flag = 0; int ret; if (chinese_name == NULL) return -1; sprintf(arabic_number, "%012d", value); chinese_name[0] = '\0'; // 亿级 arabic_to_chinese_below_ten_thousand( temp_chinese_name, arabic_number); if (strlen(temp_chinese_name) > 0) { flag = 1; strcat(chinese_name, temp_chinese_name); strcat(chinese_name, ONE_HUNDRED_MILLION); } // 万级 ret = arabic_to_chinese_below_ten_thousand( temp_chinese_name, arabic_number+4); if (strlen(temp_chinese_name) > 0) { if (flag == 1 && ret == NEED_ZERO_PREFIX) strcat(chinese_name, digit_chinese_name[0]); flag = 1; strcat(chinese_name, temp_chinese_name); strcat(chinese_name, TEN_THOUSAND); } // 个级 ret = arabic_to_chinese_below_ten_thousand( temp_chinese_name, arabic_number+8); if (strlen(temp_chinese_name) > 0) { if (flag == 1 && ret == NEED_ZERO_PREFIX) strcat(chinese_name, digit_chinese_name[0]); strcat(chinese_name, temp_chinese_name); } // “一十”开头的,去掉“一”字 if (!strncmp(chinese_name, ONE_BEFORE_TEN, strlen(ONE_BEFORE_TEN))) { memmove(chinese_name, chinese_name+strlen(digit_chinese_name[1]), strlen(chinese_name+1)); } // 如果输入是“0”的话,输出“零” if (strlen(chinese_name) == 0) strcat(chinese_name, digit_chinese_name[0]); return 0; } /** * @brief 主函数 * @return 成功返回EXIT_SUCCESS */ int main(void) { int value; char chinese_name[MAX_LENGTH]; while (scanf("%d", &value) != EOF) { value_to_chinese(chinese_name, value); puts(chinese_name); } return EXIT_SUCCESS; }
相关文章推荐
- Lua中table.sort() 报错 attempt to compare number with nil和invalid order function for sorting
- git 忽略文件 .gitignore 以及规则
- NGINX 配置 SSL 证书 + 搭建 HTTPS 网站教程
- 号称性能最好的JDBC连接池:HikariCP
- [Android] Android开发优化之——使用软引用和弱引用
- Sublime使用说明
- AMR 转mp3 失败
- 谈谈创业管理
- poj 2955 Brackets(区间dp)
- 『Python』爬行搜索引擎结果获得指定主机二级域名及IP信息
- 自定义控件的常用属性
- git与github的连接
- 导航栏+状态栏+标签栏高度获取方法
- LeetCode Basic Calculator
- C语言动态内存管理
- 实验五 Java网络编程及安全
- http发送http报文
- java 性能调优
- OC 入门开发之xCode环境搭建
- java 性能调优