华为机试HJ95:人民币转换

简介: 华为机试HJ95:人民币转换

题目描述:

考试题目和要点:


1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。


2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。


3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如6007.14,应写成“人民币陆仟零柒元壹角肆分“。


4、10应写作“拾”,100应写作“壹佰”。例如,1010.00应写作“人民币壹仟零拾元整”,110.00应写作“人民币壹佰拾元整”


5、十万以上的数字接千不用加“零”,例如,30105000.00应写作“人民币叁仟零拾万伍仟元整”


本题含有多组样例输入。

输入描述:

输入一个double数

输出描述:

输出人民币格式

示例:

输入:

151121.15

10012.02

13.64

0.85

输出:

人民币拾伍万壹仟壹佰贰拾壹元壹角伍分

人民币壹万零拾贰元贰分

人民币拾叁元陆角肆分

人民币捌角伍分

解题思路:

这题主要理解起来麻烦,一点点剖开就是个数字解析成字符串的问题。


1)首先输入数字后,将数字按照小数点前后分为前子串和后子串;若前子串为0,说明钱只跟角和分有关,如果后子串也是0,那就输出零元整,若后一位为0,那就输出零几分,后第二位为0,输出几角,两个都不为0,就是几角几分。


2)这个步骤是代码if(t2!=1)里的操作。若前子串不为0,则从最开头一位位分析,先对前子串尺寸分析,t1表示尺寸除4,t2表示尺寸余4,当t2不为1时,说明该位不是万、亿、万亿这级,那就继续分析,连续两个0就消除一个0,只有1个0就输出一个零字,若是十几,就输出拾几,若是几十,就输出对应汉字。


3)这个步骤是代码if(t2!=1)对应的else里的操作。此时t2为1,说明后面该跟万、亿这种,如果该位不是0,就输出对应汉字加级数(万、亿);若为0,则直接输出级数。


4)最后,再输出后子串的内容,即几角几分。

测试代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> nums={ "零","壹","贰","叁","肆","伍","陆","柒","捌","玖" };
vector<string> unit1={ "元","万","亿" ,"万","亿" };
vector<string> unit2={ "仟"," ","拾","佰" };
int main()
{
    double money;
    while(cin>>money)
    {
        cout<<"人民币";
        string sm=to_string(money);
        int index=sm.find('.');
        string mf=sm.substr(0,index);
        string mb=sm.substr(index+1);
        if(mf=="0")
        {
            if(mb[0]=='0'&&mb[1]=='0')
                cout<<"零元整";
            else if(mb[1]=='0')
                cout<<nums[mb[0]-'0']<<"角";
            else if(mb[0]=='0')
                cout<<"零"<<nums[mb[1]-'0']<<"分";
            else
                cout<<nums[mb[0]-'0']<<"角"<<nums[mb[1]-'0']<<"分";
            cout<<endl;
            continue;
        }
        while(mf.size())
        {
            int t1=mf.size()/4;
            int t2=mf.size()%4;
            if(t2!=1)
            {
                if(mf[0]=='0')
                {
                    if(mf[1]=='0')
                    {
                        mf=mf.substr(1);
                        continue;
                    }
                    else{
                        cout<<nums[0];
                    }
                }
                else{
                    if(mf[0]-'0'==1&&t2==2)
                        cout<<unit2[t2];
                    else{
                        cout<<nums[mf[0]-'0']<<unit2[t2];
                    }
                }
            }
            else{
                if(mf[0]=='0')
                {
                    cout<<unit1[t1];
                }
                else{
                    cout<<nums[mf[0]-'0']<<unit1[t1];
                }
            }
            mf=mf.substr(1);
        }
        if(mb[0]=='0'&&mb[1]=='0')
            cout<<"整";
        else if(mb[1]=='0')
             cout<<nums[mb[0]-'0']<<"角";
        else if(mb[0]=='0')
             cout<<nums[mb[1]-'0']<<"分";
        else
             cout<<nums[mb[0]-'0']<<"角"<<nums[mb[1]-'0']<<"分";
        cout<<endl;
    }
    return 0;
}


相关文章
华为机试HJ96:表示数字
华为机试HJ96:表示数字
118 1
|
Serverless 测试技术
华为机试HJ97:记负均正
华为机试HJ97:记负均正
137 1
华为机试HJ105:记负均正II
华为机试HJ105:记负均正II
122 1
|
测试技术
华为机试HJ77:火车进站
华为机试HJ77:火车进站
131 1
|
容器
华为机试HJ102:字符统计
华为机试HJ102:字符统计
171 1
华为机试HJ75:公共子串计算
华为机试HJ75:公共子串计算
101 0
华为机试HJ56:完全数计算
华为机试HJ56:完全数计算
|
容器
华为机试HJ89:24点运算
华为机试HJ89:24点运算
150 0
|
C++ Python
华为机试HJ50:四则运算
华为机试HJ50:四则运算
170 0

热门文章

最新文章