草庐IT

【华为OD机试】1038 - 学英语

KJ.JK 2023-04-29 原文

文章目录


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:华为OD机试(Java&Python&C语言)

一、题目


🔸题目描述

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


🔸输入输出

输入
输入一个long型整数
 
输出
输出相应的英文写法


🔸样例1

输入
22


输出
twenty two

二、代码参考


/*
小于20的直接读数,如果个位和十位是0,则不需要读数(正百的100,例:one hundred);
如果有百位读取百位,
如果个位和十位是0,则不需要加and,否则需要加and,加hubdred,加百位 2、大于20的,依次添加个位,十位,百位;
添加百位的时候,先加and,加hundred,加百位
*/
import java.util.*;
public class Main {
     public static void main(String[] args){
         Scanner in = new Scanner(System.in);
         String[] NUMS = {"zero", "one", "two", "three", "four", "five", "six", "seven",
                         "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
                         "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"};
         String[] NUMSSHI = {"zero", "ten", "twenty", "thirty", "forty", "fifty",
                            "sixty", "seventy", "eighty", "ninety"};
         String[] POWER = {"", "hundred", "thousand", "million", "billion"};
         while(in.hasNext()){
             String line = in.nextLine();
             StringBuilder sb = new StringBuilder();
             ArrayList<String> lists = new ArrayList<>();
             if(!line.matches("\\d+")){//如果匹配的不是数字
                 System.out.println("error");
             }
             int linenum = Integer.parseInt(line);
             int power = 1;//单位
             while(linenum != 0){
                 if(power != 1){
                     lists.add(POWER[power]);//添加单位
                 }
                 int t = linenum % 1000;//取低三位
                 //注意小于20,直接读
                 if(t % 100 <= 20){
                     if(t % 100 != 0){//十位和个位是零的话就不需要读数了
                         lists.add(NUMS[t % 100]);
                     }
                     if(t / 100 != 0){//有百位
                         if(t % 100 != 0){//十位和个位是零的话就不需要添加and了
                             lists.add("and");
                         }
                         lists.add("hundred");
                         lists.add(NUMS[t / 100]);
                     }
                 }else{//大于20
                     // 有个位
                     if(t % 10 != 0){
                         lists.add(NUMS[t % 10]);
                     }
                     t /= 10;
                     // 有十位
                     if(t % 10 != 0){
                         lists.add(NUMSSHI[t % 10]);
                     }
                     t /= 10;
                     // 有百位
                     if(t % 10 != 0){
                         lists.add("and");
                         lists.add("hundred");
                         lists.add(NUMS[t % 10]);
                     }
                 }
                 linenum /= 1000;//每次缩小1000倍
                 power++;//单位*1000
             }
             //添加的时候,先添加低位,读数的时候先读高位,倒着读
             for(int i = lists.size() - 1; i >= 0; i--){
                 if(i!=0){
                     sb.append(lists.get(i) + " ");
                 }else{
                     sb.append(lists.get(i));//最后一个不加空格
                 }
             }
             System.out.println(sb.toString());
         }
     }   
}



--------------------------------------------------------


num1 = ['zero','one','two','three','four','five','six',
       'seven','eight','nine','ten','eleven','twelve',
       'thirteen','fourteen','fifteen','sixteen',
       'seventeen','eighteen','nineteen']
num2 = [0,0,'twenty','thirty','forty','fifty','sixty',
       'seventy','eighty','ninety']

# 100以内转英文
def n2w(n):
    if n > 0:
        if n < 20:
            word.append(num1[n])
        else:
            word.append(num2[n//10])
            if n%10 != 0:
                word.append(num1[n%10])

# 1000以内转英文
def hun(n):
    if n >= 100:
        word.append(num1[n//100])
        word.append('hundred')
        if n % 100 != 0:
            word.append('and')
    n2w(n%100)

while True:
    try:
        n = int(input())
    except:
        break
    else:
        word = []
        a = n % 1000  # 个十百位
        b = (n//1000) % 1000  # 个十百千
        c = (n//1000000) % 1000  #个十百m
        d = n // 1000000000    # 个十百b
        
        if d > 0:
            hun(d)
            word.append('billion')
        if c > 0 :
            hun(c)
            word.append('million')
        if b > 0:
            hun(b)
            word.append('thousand')
        if a > 0 :
            hun(a)
        print(' '.join(word))



--------------------------------------------------------------


#include<stdio.h>


int main(){
    int in;
    char s2[10][10] = {"zero", "one", "two", "three", "four","five", "six", "seven", "eight", "nine"};
    char s1[10][10] = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
                                      "sixteen", "seventeen", "eighteen", "nineteen"};
    char s0[10][10] = {"ten", "twenty", "thirty", "forty", "fifty",
                                    "sixty", "seventy", "eighty", "ninety"};
    scanf("%d",&in);
    int m[9];
    int k=8;
    while(k>=0){
        m[k] = in%10;
        in = in/10;
        k--;
    }
    
    int f_and = 0;
    for(int i=0;i<3;i++){
        int sum = 0;
        for(int j=0;j<3;j++){
            int idx = i*3+j;
            sum += m[idx];
            if(m[idx]!=0){
                if(j==0){
                    printf("%s hundred ",s2[m[idx]]);
                    f_and = 1;
                }
                else if(j==1){
                     if(f_and==1){
                         printf("and ");
                         f_and = 0;
                     }
                    if(m[idx]>1) //输出>=20的整10数
                         printf("%s ",s0[m[idx]-1]);
                    else if(m[idx]==1 && m[idx+1]==0){  // ten
                        printf("ten ");
                    }
                }
                else{
                    if(f_and==1){
                         printf("and ");
                         f_and = 0;
                     }
                    if(m[idx-1]==1){
                        printf("%s ",s1[m[idx]]);
                    }
                    else{
                        printf("%s ",s2[m[idx]]);
                    }
                }
                
            }
            
        }
        if(sum!=0){
            if(i==0)
                printf("million ");
            else if(i==1)
                printf("thousand ");
        }
    }
}
  





作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

有关【华为OD机试】1038 - 学英语的更多相关文章

  1. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  2. 华为常用命令 - 2

    system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100

  3. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  4. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  5. 西安华为OD面试体验 - 2

    西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,

  6. ruby - 如何在 Ruby 中使用 DateTime strptime 解析非英语日期? - 2

    我正在尝试解析从CMS导出的日期。不幸的是,瑞典语言环境设置。月份名称缩写为三个字符,这在May和October月份时有所不同(“maj”与“May”以及“okt”与“Oct”)。我希望使用具有正确区域设置的DateTime.strptime来解决这个问题,如下所示:require'locale'Locale.default="sv_SE"require'date'DateTime.strptime("10okt200904:32",'%d%b%Y%H:%M')然而,日期仍然被解析,因为它会使用英文缩写的月份名称:ArgumentError:invaliddatefromlib/rub

  7. ruby - 您如何指定适用于英语以外的欧洲语言的正则表达式字符范围? - 2

    我正在使用Ruby的正则表达式引擎。我需要编写一个执行此操作的正则表达式WIKI_WORD=/\b([a-z][\w_]+\.)?[A-Z][a-z]+[A-Z]\w*\b/但也可以使用除英语以外的其他欧洲语言。我认为字符范围[a-z]不会涵盖德语等的小写字母。 最佳答案 WIKI_WORD=/\b(\p{Ll}\w+\.)?\p{Lu}\p{Ll}+\p{Lu}\w*\b/u应该在Ruby1.9中工作。\p{Lu}和\p{Ll}是大写和小写Unicode字母的简写。(\w已经包含下划线)另见thisanswer-您可能需要在UTF

  8. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  9. 中润光学在科创板IPO过会:拟募资4亿元,张平华为实际控制人 - 2

    近日,上海证券交易所科创板披露的信息显示,嘉兴中润光学科技股份有限公司(下称“中润光学”)获得上市委会议通过。这意味着,中润光学的上市之路获得实质性进展,接下来将提交注册。据贝多财经了解,中润光学的招股书于2022年5月20日获得科创板受理,5个月后便获得上市委会议通过,进度不可谓不快。本次冲刺科创板上市,中润光学拟募资4.05亿元,计划用于高端光学镜头智能制造项目、高端光学镜头研发中心升级项目等。天眼查信息显示,中润光学成立于2012年8月,是一家以从事非金属矿物制品业为主的企业。当前,该公司的注册资本为6600万元,法定代表人为张平华。穿透股权可知,张平华也是该公司的实际控制人。据招股书介

  10. 阿里云,华为云,腾讯云三大公有云厂商,香港地区主机测评 - 2

    三大公有云厂商,香港地区主机测评一、ping时延比对(厦门电信本地测试):Ping时延测试腾讯云阿里云华为云延迟率最低时延44ms,最高72ms,平均46ms47.242段:最低时延59ms,最高204ms,平均107ms最低时延45ms,最高93ms,平均47ms丢包率丢包率小有的ip段丢包率较大每个段都会有概率丢包阿里云:47.242段:最低时延59ms,最高204ms,平均107ms,有的ip段丢包率较大8.210段:最低时延64ms,最高232ms,平均119ms,丢包率较好腾讯云:最低时延44ms,最高72ms,平均46ms,丢包率小华为云:最低时延45ms,最高93ms,平均47m

随机推荐