[PTA] 7-23 币值转换(20 分)

来源:互联网 发布:使命召唤 知乎 编辑:程序博客网 时间:2024/05/17 00:53

7-23 币值转换(20 分)

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:
输入在一行中给出一个不超过9位的非负整数。

输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:
813227345

输出样例1:
iYbQdBcScWhQdBeSf

输入样例2:
6900

输出样例2:
gQjB

**这是一个我自认为是对的程序 **

updated:解决了输入0;

说到这我突然想起来这段代码还有不健全的地方就是”10“应该是”十“而不是”一十“,而其他情况都是”一十“,我还没考虑前者。不过测试点没这个,侥幸过了2333 。我回去小改一下。

//原来我出错的测试点是输入0的时候#include <iostream>#include <string>#include <cstring>using namespace std;//字符->数字inline int toNum(char c) {    return static_cast<int>(c-'0');}int ecx(string &s) {    if(s.size()==9) {        //考虑到这种情况100000001,这里的”万“是没有的,即,壹亿零壹        //而除了这种情况,大于9999的时候必有”万“        if(s[1]=='0' && s[2]=='0' && s[3]=='0' && s[4]=='0') {            return 1;        }        else return 0;    }    else return 0;}int main() {    int index1,index2,temp=-1, h=0;    string input;    cin >> input;    char res[30];    memset(res,'\0',sizeof(char)*30);    char num[10]={'a','b','c','d','e','f','g','h','i','j'};    char unit[10]={'\0','\0','S','B','Q','W','S','B','Q','Y'};    auto len = input.size();    //这里零都会重复,且除了零之外每一位都有后接的单位    for(auto i=0; i!=len; ++i) {        char c=num[toNum(input[i])];        res[h] = c;        if((c!='a' && i!=len-1) || (len-i==5 && !ecx(input)))            res[++h] = unit[len-i];        ++h;    }    //index1记录从后往前数不为零的地方,并忽略之    //解决”63000“此类的问题    for(int i=strlen(res)-1; i>=0; --i) {        if(res[i]!='a') {            index1 = i+1;            break;        }    }    //此处记录在res中”万“的位置,没有的话就是原值-1    for(int i=strlen(res)-1; i>=0; --i) {        if(res[i]=='W') {            temp = i;            break;        }    }    //与之前原理类似,从”十万“位开始找,找到第一个不是0的    //解决了这种情况”69000000“,不处理这个的话,会变成六千九百零万    if(temp!=-1) {        for(int i=temp-1; i>=0; --i) {            if(res[i]!='a') {                index2 = i+1;                break;            }        }    }    //前面的两句控制前面的情况,输出的时候控制如果此时是0,下一个不是0就输出一个零    for(int i=0; i<strlen(res); ++i) {        //当只有一位的时候,有情况0,如果不单列,就会没有结果        if(i==index1 && lenRes!=1) break;        if(temp!=-1) {            if(i>=index2 && i<temp) continue;        }        if(res[i]=='a' && res[i+1]!='a') {            cout<<'a';        }        if(res[i]!='a') cout<<res[i];    }    return 0;}

代码写的很糟糕,通用性较差,但AC总有一测试点过不去,遂查询,发现有一个类似的疑问:[一亿零零一???](http://blog.csdn.net/ccDLlyy/article/details/52070666)

来自ccDLlyy的博客

不知是不是bug了。

是我naive了!

原创粉丝点击