HJ42 学英语

本文是一篇编程问题解答,描述了如何使用C++编写程序将任意正整数按照英语读法转换,包括处理三位数单位(千、百万、十亿)以及百位与十位之间的and连接。
摘要由CSDN通过智能技术生成

描述

Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:
具体规则如下:
1.在英语读法中三位数字看成一整体,后面再加一个计数单位。从最右边往左数,三位一单位,例如12,345 等
2.每三位数后记得带上计数单位 分别是thousand, million, billion.
3.公式:百万以下千以上的数 X thousand X, 10亿以下百万以上的数:X million X thousand X, 10 亿以上的数:X billion X million X thousand X. 每个X分别代表三位数或两位数或一位数。
4.在英式英语中百位数和十位数之间要加and,美式英语中则会省略,我们这个题目采用加上and,百分位为零的话,这道题目我们省略and
下面再看几个数字例句:

22: twenty two

100:  one hundred

145:  one hundred and forty five
1,234:  one thousand two hundred and thirty four
8,088:  eight thousand (and) eighty eight (注:这个and可加可不加,这个题目我们选择不加)
486,669:  four hundred and eighty six thousand six hundred and sixty nine
1,652,510:  one million six hundred and fifty two thousand five hundred and ten
说明:
数字为正整数,不考虑小数,转化结果为英文小写;
保证输入的数据合法

关键字提示:and,billion,million,thousand,hundred。

数据范围:1≤n≤2000000 

输入描述:

输入一个long型整数

输出描述:

输出相应的英文写法

示例1

输入:

22

输出:

twenty two

#include<cstdio>
#include<string>
#include<vector>
#include<map>
using namespace std;

map<int,string> myMap={
    {0,"zero"},     {1,"one"},        {2,"two"},          {3,"three"}, 
    {4,"four"},     {5,"five"},       {6,"six"},          {7,"seven"},   
    {8,"eight"},    {9,"nine"},       {10,"ten"},         {11,"eleven"},  
    {12,"twelve"},  {13,"thirteen"},  {14,"fourteen"},    {15,"fifteen"},   
    {16,"sixteen"}, {17,"seventeen"}, {18,"eighteen"},    {19,"nineteen"},
    {20,"twenty"},  {30,"thirty"},    {40,"forty"},       {50,"fifty"},
    {60,"sixty"},   {70,"seventy"},   {80,"eighty"},      {90,"ninety"},
    {100,"hundred"},{1000,"thousand"},{1000000,"million"},{1000000000,"billion"}
};

string transf(int n)
{
    string num="";
    // 20以内的数
    if(n>=0 && n<=20)
    {
        num=myMap[n];
    }
    // 20以上的2位数
    else if(n>20 && n<100)
    {
        // 如果是整十
        if(n%10==0)
        {
            num=myMap[n];
        }
        //非整十
        else {
            num=myMap[(n/10)*10]+" "+myMap[n%10];
        }
    }
    // 3位数
    else if(n>=100 && n<1000)
    {
        // 如果是整百
        if(n%100==0)
        {
            num=myMap[n/100]+" "+myMap[100];
        }
        // 非整百
        else
        {
            // 低2位数在20以内
            if(n%100>0 && n%100<=20)
            {
                num=myMap[n/100]+" "+myMap[100]+" "+"and"+" "+myMap[n%100];
            }
            // 低两位超过20
            else
            {   //低两位整十
                if(n%10==0)
                {
                    num=myMap[n/100]+" "+myMap[100]+" "+"and"+" "+myMap[n%100];
                }
                //低两位非整十
                else {
                    num=myMap[n/100]+" "+myMap[100]+" "+"and"+" "+myMap[((n%100)/10)*10]+" "+myMap[n%10];
                }
                
            }
        }

    }
    return num;
}

int main()
{
    // 1.输入
    long long num;
    scanf("%lld",&num);

    // 2.把数字划按3位划分,低位 --> 高位
    int i=0;
    int temp=0; 
    vector<int> vec;  
    //小于3位数
    if(num<1000) 
    {
        vec.push_back(num);
    }
    // 超过3位数
    else {
        while (num) {
        if(i==3)
        {
            vec.push_back(temp);
            i=0;
            temp=0;
            if(num<1000) //最后少于3位数
            {
                vec.push_back(num);
                break;
            }
        }
        int r=1;
        for(int j=0;j<i;j++)
        {
            r*=10;
        }
        temp+=(num%10)*r;
        num/=10;
        i++;
    }
    }
    
    /*
    千:  thousand  1,000
    百万:million   1,000,000
    十亿:billion   1,000,000,000
    */ 
    // 3.转换
    vector<string> result;//存储转换结果
    string str="";
    for(int i=0;i<vec.size();i++) //低位-<高位
    {
        if(i==3)
        {
            str=transf(vec[i])+" "+myMap[1000000000];
        }
        if(i==2)
        {
            str=transf(vec[i])+" "+myMap[1000000];
        }
        if(i==1)
        {
            str=transf(vec[i])+" "+myMap[1000];
        }
        if(i==0)
        {
            str=transf(vec[i]);
        }
        
        result.push_back(str);
    }


    // 4.输出
    for(int i=result.size()-1;i>=0;i--)
    {
        printf("%s ",result[i].c_str());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值