输入一串数字,输出其中文读法

我15年面试的一道题目,当时却花了不少时间。题目如下:

输入一串数字(12位以内整数),然后输出其中文读法,如:
输入0,输出零;
输入100,输出一百;
输入101000,输出一十万一千;
输入100100,输出一十万零一百;
输入100010001000,输出一千亿一千万一千;
输入100100100100,输出一千零一亿零一十万零一百;
输入101010101010,输出一千零一十亿一千零一十万一千零一十;

用C语言实现,代码如下:

#include <stdio.h>
#include <string.h>

int main()
{
int i,j,cnt2; //定义变量
int cnt; //定义数字长度
char num[12]; //定义输入的数组
char hz[][9] = {"零","一","二","三","四","五","六","七","八","九"}; //数字的中文读法
char dw[][12] = {" ","十","百","千","万","十","百","千","亿","十","百","千"}; //数字的单位,此数字与变量j有关系

while(1){
    i = 0;
    
    gets(num);      
    cnt = strlen(num);      //统计数字的长度 
    cnt2 = cnt;      
     
    j = cnt2 - 1;       // 通过这个式子可以确定首位数的单位(单位是dw[j]),然后cnt--依次求出后一位数的单位 
    
    while(cnt2 > 0){
        if((num[i]-'0') != 0){      //num[i]-'0' 这个式子提出存在数组里的int ,判断此数是否为零 
            printf("%s%s",hz[num[i]-'0'],dw[j]);        //只要不是零,输出其中文和对应的单位 
        }
        else if((num[i]-'0') == 0){     //若此位上数字为零 
            if(cnt == 1)        //若num长度为一 
            printf("%s",hz[0]);     //输出'零' 
            else if(j != 0){    //若不为个位 
                if(j == 8)      //若是亿位 
                printf("%s",dw[j]);     //输出'亿'     
                else if(j == 4 ){       //若是万位 
                    if(cnt > 8){        //num长度大于8 
                        if((num[(cnt-8)]-'0') == 0 && (num[(cnt-7)]-'0') == 0 && (num[(cnt-6)]-'0') == 0){      //若十万百万千万皆为零 
                            if((num[i+1]-'0') != 0)
                            printf("%s",hz[0]);     //若后一位数不为零则输出'零' 
                        }       
                        else
                        printf("%s",dw[j]);     //输出'万'                         
                    }
                    else
                    printf("%s",dw[j]);     //输出'万'                     
                }
                else if((num[i+1]-'0') != 0)        //若不为个位且不为万位且不为亿位,则判断后一位数是否为零 
                printf("%s",hz[0]);     //若后一位数不为零则输出'零'                    
            }
        }
        cnt2--;     //cnt2自减使得循环能在cnt2>0条件下跳出 
        i++;        //遍历num数组 
        j--;        
    }   
    printf("\n"); 
}
return 0;

}

用JAVA实现,代码如下:

import java.util.Scanner;

public class test {

public static  void main(String[] args) {

    Scanner s = new Scanner(System.in);

    while (1 == 1)
    {
        String hz = "零一二三四五六七八九";
        String dw = "  十百千万十百千亿十百千";
        String num = null;
        num = s.next();
        int cnt;
        int j;
        int i;
        int sjsz;       //字符串num里第i位实际数字

        cnt = num.length();

        j = cnt;
        for (i = 0; i < cnt; i++)
        {
            sjsz = (num.charAt(i) - '0');
            if ( sjsz != 0 )     //若此位上数不为零
            {
                System.out.print(hz.charAt(sjsz));      //输出中文和对应单位
                System.out.print(dw.charAt(j));
            }
            else if ( j == 1 )        //若是个位
            {
                if ( cnt < 2 )
                {
                    System.out.print(hz.charAt(sjsz));
                }
            }
            else if ( j == 9 )        //若是亿位
            {
                System.out.print(dw.charAt(j));
            }
            else if ( j == 5 )        //若是万位
            {
                if ( cnt > 8 )
                {
                    if ( (num.charAt(cnt-8)-'0') == 0 && (num.charAt(cnt-7)-'0') == 0 && (num.charAt(cnt-6)-'0') == 0 )
                    {
                        if ( (num.charAt(i+1)-'0') != 0 )
                        {
                            System.out.print(hz.charAt(sjsz));      //输出零
                        }
                    }
                    else
                    {
                        System.out.print(dw.charAt(j));     //输出万
                    }
                }
                else
                {
                    System.out.print(dw.charAt(j));         //输出万
                }
            }
            else if ( (num.charAt(i+1)-'0') != 0 )
            {
                System.out.print(hz.charAt(sjsz));
            }
            j--;
        }
        System.out.println();
    }
}

}

标签: Java, C语言
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
Title - Artist
0:00
    bst g22 jinniu lilai opebet orange88 vinbet xbet yuebo zunlong shijiebei bet007 hg0088 ju111 letiantang m88 mayaba qg777 qianyiguoji sbf777 tengbohui tlc ule weilianxier waiweitouzhu xingfayule xinhaotiandi yinheyule youfayule zhongying 2018shijiebei w88 18luck 188bet beplay manbet 12bet 95zz shenbo weide1946 ca88 88bifa aomenxinpujing betway bodog bt365 bwin tongbao vwin weinisiren 88jt fenghuangyule hongyunguoji 918botiantang huanyayule jianada28 jixiangfang libo long8 hongzuyishi zuqiutouzhu </