郑州轻工业学院(ZZULI) OJ系统第1431题 读数字 解题报告

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1074

【阿里云】双十一活动,全年抄底价,限时3天!(老用户也有),
入口地址https://www.aliyun.com/1111/home

推荐:linux下intel的ifort,icc编译器以及数学库MKL的下载安装及配置详解

[ifort,icc是一款非常不错的编译器,intel有非商业版,可以免费下载,虽不提供技术支持,但对于大多数普通用户来讲,已经够用了.下面我就ifort,icc编译器的下载安装及配

试题

试题链接

Description

以前比赛的时候大家最喜闻乐见的题目大概就是A+B了,但是现在的A+B一个比一个麻烦,基本上不带点儿进制转换数值处理什么的都不好意思说自己是A+B。A+B早已经不是简单的代名词了!

今天,我们决定用一道新的题目来重新定义一下水题该有的样子,这道题目一定要比A+B更简单、更直白,让人看到之后不用计算随口就能把答案说出来!

这道题就是读数字!是的!你没看错!不是小明读数字!不是大明读数字!!更不是人见人爱读数字和火星读数字!

读入一个整数,然后请用汉语将它表示出来。比如对于10,请输出“十”(不含双引号),对于1234,输出“一千二百三十四”。

是不是很简单?是不是看到数据就不自觉地把答案念出来了?那还犹豫什么?赶紧A掉它吧!

Input

多组测试数据。每组测试数据包含一个整数n(0≤n<109)。

Output

一串汉字

Sample Input

15
110100000
1010

Sample Output

十五
一亿一千零一十万
一千零一十

试题大意

多组数据,每组数据输入一个小于 109 的正整数或0(阿拉伯数字,十进制),输出这个数字的中文名。例如输入12096,输出“一万二千零九十六”。

推荐:社区发现(Community Detection)算法

[作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905   社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算

复习小学数学

从右往左,每四位分一级,分别叫做“个级”、“万级”和“亿级”。
含有个级、万级和亿级的数,必须先读亿级,再读万级,最后读个级。
亿级和万级的数都按个级的读数方法来读,在后面加上“亿”或“万”字。
在级末尾的“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;
}

推荐:python用于数学计算的工具介绍:scipy和numpy

[SciPy入门指南这个教程是为了帮助初学者掌握scipy并且肯能快地实际使用。什么是scipy、numpy、matplotlib?它们是用来干什么的?如何使用scipy工作学习使用scipy示例会话

相关推荐