数的读法

感觉这道题很好玩儿。里面需要考虑的情况也不少,代码写的时候属于插着写的,一会儿想起来哪种情况没考虑就插进去。整个写完之后感觉顺序乱乱的。
没啥需要分析的,就是考虑情况是否全面的问题了。思考过程都在代码注释里。

顺便我没按照标准输出来。我做成中文了。。看着舒服


问题描述

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”。

输入格式

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

输出格式

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

样例输入

1234567009

样例输出

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



/*
    0v0 AUTHER: 0_Re5et
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void NumTrans_E(int n)
// 数字发音 拼音 
{
    switch(n)
    {

        case -1:
            break;      // 特殊情况,不发音
        case 0:
            printf("ling ");
            break;
        case 1:
            printf("yi ");
            break;
        case 2:
            printf("er ");
            break;
        case 3:
            printf("san ");
            break;
        case 4:
            printf("si ");
            break;
        case 5:
            printf("wu ");
            break;
        case 6:
            printf("liu ");
            break;
        case 7:
            printf("qi ");
            break;
        case 8:
            printf("ba ");
            break;
        case 9:
            printf("jiu ");
            break;
    }
}


void BitTrans_E(int n, int flag)
// 位发音 拼音 
{
    if(flag != 0)
    {
        switch(n)
        {
            case 0:
                printf("shi ");
                break;
            case 1:
                printf("*yi ");
                break;
            case 2:
                printf("qian ");
                break;
            case 3:
                printf("bai ");
                break;
            case 4:
                printf("shi ");
                break;
            case 5:
                printf("wan ");
                break;
            case 6:
                printf("qian ");
                break;
            case 7:
                printf("bai ");
                break;
            case 8:
                printf("shi ");
                break;
        }
    }

}

void NumTrans_C(int n)
// 数字发音 汉字 
{
    switch(n)
    {

        case -1:
            break;      // 特殊情况,不发音
        case 0:
            printf("零");
            break;
        case 1:
            printf("一");
            break;
        case 2:
            printf("二");
            break;
        case 3:
            printf("三");
            break;
        case 4:
            printf("四");
            break;
        case 5:
            printf("五");
            break;
        case 6:
            printf("六");
            break;
        case 7:
            printf("七");
            break;
        case 8:
            printf("八");
            break;
        case 9:
            printf("九");
            break;
    }
}

void BitTrans_C(int n, int flag)
// 位发音 汉字 
{
    if(flag != 0)
    {
        switch(n)
        {
            case 0:
                printf("十");
                break;
            case 1:
                printf("亿");
                break;
            case 2:
                printf("千");
                break;
            case 3:
                printf("百");
                break;
            case 4:
                printf("十");
                break;
            case 5:
                printf("万");
                break;
            case 6:
                printf("千");
                break;
            case 7:
                printf("百");
                break;
            case 8:
                printf("十");
                break;
        }
    }

}

int main()
{
    char number[11] = {'\0'};
    int len, i, j, temp, ti;
    int numb[10] = {0};                // 用于按位存放数字(int型) 
    int s = 9, t = 10;                 // 记录与个位相连的零的范围 
    int flag[10] = {0};                // 标记 位 是否发音 

    scanf("%s", number);

    len = strlen(number);

    for(i=0; i<len; i++)
    {
        if(number[i] >= '0' && number[i] <= '9')
        {
            continue;
        }
        else
        {
            printf("输入有误");
            exit(0);
        }
    }
    if(len > 10)
    {
        printf("数字超限");
        exit(0);
    }
    // 容错 

    if(strcmp(number, "2000000000") == 0)
    {
        printf("er shi yi");
        exit(0);
    }
    else if(strcmp(number, "0") == 0)
    {
        printf("ling");
        exit(0);
    }
    // 二十亿和零作为边界特殊情况处理

    for(i=0; i<10; i++)
    {
        flag[i] = -1;
    }
    // 数组初始化 

    s = 10 - len;   // s记录数字最高位对应的数组下标

    for(i=s, j=0; i<10; i++)
    {
        numb[i] = number[j++] - '0';
    }
    // 将数字存入int数组


    if(s == 0 && numb[s] == 1)
        // 十亿
    {
        numb[s] = -1;
        // 使其不发音
    }
    else if(s == 0 && numb[s] >=2)
    {
        printf("数字超限");
        exit(0);
    }
    else if(s == 4 && numb[s] == 1)
        // 十万
    {
        numb[s] = -1;
    }
    else if(s == 8 && numb[s] == 1)
        // 十位
    {
        numb[s] = -1;
    }
    // 以上为十发音的特殊讨论


    for(i=s; i<10; i++)
    {
        if(numb[i] != 0)
        {
            flag[i] = 1;
        }
        // 非零位一定发音 
    }
    // 处理位发音标记数组 

    for(i=9; i>s; i--)
    {
        if(numb[i] == 0)
        {
            t = i;
            flag[i] = 0;     // 位 不发音 
            numb[i] = -1;    // 数字 不发音 
        }
        else
        {
            break;
        }
    }
    // 与个位相连的0,数字和位都不发音。t记录与个位相连的0的最高位且t初始值为10


    for(i=s; i<t; i++)
    {
        if(numb[i] == 0)
        {
            ti = i;
            while(ti <= 9)
            {
                temp = numb[ti+1];
                if(temp == 0)
                {
                    flag[ti] = 0;
                    numb[ti] = -1; 
                    ti++;
                }
                else
                {
                    flag[ti] = 0;
                    numb[ti] = 0;
                    i = ti;
                    break; 
                }
            }
        }
    }
    // 处理连续多个零出现的情况

    if(s == 0 && flag[1] == 0 )
    {
        flag[1] = 1;
    }
    if( (s >= 2 || s <= 4) && flag[5] == 0 && (numb[2] == 0 || numb[3] == 0 || numb[4] == 0))
    {
        flag[5] = 1;
    }
    // 例如 2100001 要读成二百一十万零一而不能读成二百一十零一


//
//  printf("\n*****num*******\n");
//  for(i=s; i<10; i++)
//  {
//      printf("%d ", numb[i]);
//  }
//  printf("\n************\n\n");
//  printf("\n*****bit*******\n");
//  for(i=s; i<10; i++)
//  {
//      printf("%d ", flag[i]);
//  }
//  printf("\n************\n\n");
//


    for(i=s; i<10; i++)
    {
        NumTrans_C(numb[i]);
        BitTrans_C(i, flag[i]);
    }
    printf("\n");
    // 读出数组


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值