拼音教学

拼音教学

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   76       Accepted:   16

 

Description

数钱啦~~~输入一个数字,小于999999999999,我们需要把他们转换为拼音,我们规定例如1234000567的念为“1十2亿3千4百万零5百6十7”具体见输入输出

 

Input

一个数字N

 

Output

数字加拼音,见SAMPLE OUTPUT

 

Sample Input

 

999999999999
123456000
1234000567

 

Sample Output

 

9qian9bai9shi9yi9qian9bai9shi9wan9qian9bai9shi9
1yi2qian3bai4shi5wan6qian
1shi2yi3qian4baiwanling5bai6shi7

 

解析:

这类题很大的一个特点就是分块讨论,因此用到递归就是必然的事,只需要注意特殊情况,如多个零连在一起时的情况,接下来只需分析清每部分数据的特点即可,还是看代码和注释吧

 

# include<iostream>
# include<stdio.h>
# include<string.h>
# include<math.h>
using namespace std;
unsigned long long n;
int cnt,leap;
char ch[6][5]={"ling","shi","bai","qian","wan","yi"};
int lp[6]={4,3,3,4,3,2};//上面字符串的长度
char str[100];
void Copy(unsigned long long sign,int power)//Copy是对一个块的分析,用的思想也是递归
{
    unsigned long long th,hun;
    if(power==0)return;
        th=sign/power;
        if(cnt==0&&th==0)
        Copy(sign,power/10);
        else if(th==0)
        {
            if(str[cnt-1]!='g')//考虑到出现重0的情况,就不用读多次了
            {
                strcat(str,ch[th]);
                cnt+=lp[th];
            }
                Copy(sign,power/10);
        }
        else 
        {
                str[cnt++]=th+'0';
                hun=(int)log10((double)(power));
                if(hun!=0)
                {
                strcat(str,ch[hun]);
                cnt+=lp[hun];
                }
                if(sign-th*power>0)
                Copy(sign-th*power,power/10);
                else if(hun!=0)
                    leap=1;
        }
}
void Judge(unsigned long long num)//递归思想
{
    unsigned long long sign;
    if(num>99999999)//分成两部分,亿以上和万以上
    {
        sign=num/100000000;
        Copy(sign,1000);
        strcat(str,ch[5]);
        cnt+=lp[5];
        if((num-sign*100000000>0)&&leap)
        {
            strcat(str,ch[0]);
            cnt+=lp[0];
            leap=0;
        }
        Judge(num-sign*100000000);
        
    }
    else if(num>9999)
    {
        sign=num/10000;
        Copy(sign,1000);
        strcat(str,ch[4]);
        cnt+=lp[4];
        if((num-sign*10000>0)&&leap)
        {
            strcat(str,ch[0]);
            cnt+=lp[0];
            leap=0;
        }
        Judge(num-sign*10000);
    }
    else if(num>0)
    Copy(num,1000);
}
int main()
{
    while((scanf("%lld",&n))!=EOF)
    {
        if(n==0)
        {
            printf("0\n");
            continue;
        }
        cnt=0;
        leap=0;
        memset(str,0,sizeof(str));
        Judge(n);
        str[cnt]='\0';//字符串的结束标记
        printf("%s\n",str);
    }
    return 0;
}

 

 

 

posted on 2013-03-07 20:22  即为将军  阅读(315)  评论(0)    收藏  举报

导航