SDNUOJ 1213.金额的中文大写

今天做了一个题,感觉网上的程序有些繁琐或者不够简明,所以打算把自己的发上来,供大家借鉴。

前几天学校的OJ坏了,刚刚修好我便看到了这个题。

1213.金额的中文大写

Time Limit: 1000 MS    Memory Limit: 131072 KB
Total Submission(s): 9    Accepted Submission(s): 4

Description

读入一个浮点数值,将其转化为金额的中文大写形式。
例如:
         123.45转化为“壹佰贰拾叁元肆角伍分”。

1)当金额为整数时,只表示整数部分,省略小数部分,并添加“整”字。
      例如:123表示为“壹佰贰拾叁元整”

2)当金额中有连续的0时(含一个0),只需写一个“零”即可。
      例如:10005表示为“壹万零伍元整”

3)10元缩写为“拾元整”。

Input

表示金额的浮点数若干,每行一个

Output

各金额的中文大写形式,每行一个

注:数字“壹贰叁肆伍陆柒捌玖拾佰仟万亿”
       单位“元角分”

Sample Input

123.45
123
10005
10

Sample Output

壹佰贰拾叁元肆角伍分
壹佰贰拾叁元整
壹万零伍元整
拾元整

题意非常清晰,就是说把阿拉伯数字的金额转换为中华民族的传统计量形式,真是一个弘扬传统文化的好题啊!做完这个题以后我对古代计量单位更了解了~~

因为输入是浮点型,而且只有角和分的话,就是小数点后至多两位了。首先要做的是把整数部分和小数部分分开,因为最后要判断加不加“整”。
在小数部分,尤其要注意它的精确度有限性,我的解决办法是加一个0.005,就四舍五入了。
经过仔细研究中国的古代计量单位,发现他是有规律的,十百千万加上亿依次循环,这样的话,我们要做的就是在一个预备数组中存入这五个字符串(注意是字符串),判断是否缀加的话,就取个4和8的模就可以了。循环加后缀,一劳永逸。然后再用一个数组存1-9的汉字形式,一一对应,以便取用。
然后最好单独写个函数,这样看起来整体会很清晰,也符合模块化程序设计的思想。
还有,题目明确要求对于10,要输出拾元整。意思就是,对于10-19这九个数,都要这样,及其浮点数。所以,要提前做一个判断,是否正规输出。
关于零的问题,做一下标记,只输出一个“零”,自己搞个判断咯。
以下是本人AC的代码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char ChinaNum[12][5]= {"","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
char ChinaMon[20][5]={"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟","亿"};
char str[105];
void ChinMonCapConvert(long double x)
{
    int i, j;
    int mon[105];
    int a = (int)x;
    int b = (x-a+0.005)*100;
    int c = a;
    int len = 0;
    for(i=0; c!=0; i++){
        mon[i]=c%10;
        c /= 10;
        len++;
    }
    int flag = 0;
    if(len==2) cout<<"拾"<<ChinaNum[a%10]<<"元";
    else{
        for(i=len-1; i>=0; i--)
        {
            if(flag&&mon[i]==0) continue;
            else flag = 0;
            if(mon[i]==0&&i>0){
                flag = 1;
                cout<<"零";
            }
            else cout<<ChinaNum[mon[i]]<<ChinaMon[i];
        }
    }
    if(b==0) cout<<"整"<<endl;
    else{
        int p = b%10;
        cout<<ChinaNum[b/10]<<"角";
        if(p) cout<<ChinaNum[p]<<"分";
        cout<<endl;

    }
}
int main()
{
    long double mon;
    int a, b;
    while(cin>>mon)
    {
       ChinMonCapConvert(mon);

    }
    return 0;
}

有些取巧之处,懒得再改,也是因为学校OJ数据挺弱的,稍微改进一下就可以应对一切转换了吧。

展开阅读全文

没有更多推荐了,返回首页