在一行上输入一个整数
代表待转换的整数。
输出若干个小写的英文单词,代表转换后的结果。
22
twenty two
2000000
two million
#include <iostream> #include <vector> #include <string> using namespace std; const vector<string> zeroToNine = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; const vector<string> tenToNineteen = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; const vector<string> tenToNinety = {"ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; const vector<string> thousandToBillion = {"thousand", "million", "billion"}; // 处理小于1000的部分 // isBegin用来表示当前的3位数是否位于数字的最高位部分 // 如果是则某些两位数或一位数之前不用加and void processThousand(int N, vector<string> &result, bool isBegin) { vector<int> inners; while (N >= 10) { inners.push_back(N % 10); N /= 10; } inners.push_back(N); // 三位数 if (inners.size() == 3) { result.push_back(zeroToNine[inners[2]]); result.push_back("hundred"); if (inners[1] == 0) { if (inners[0] > 0) { result.push_back("and"); result.push_back(zeroToNine[inners[0]]); } } else if (inners[1] == 1) { result.push_back("and"); result.push_back(tenToNineteen[inners[0]]); } else { result.push_back("and"); result.push_back(tenToNinety[inners[1] - 1]); if (inners[0] > 0) { result.push_back(zeroToNine[inners[0]]); } } } // 两位数 else if (inners.size() == 2) { if (inners[1] == 1) { /* if (! isBegin) { result.push_back("and"); } */ result.push_back(tenToNineteen[inners[0]]); } else { /* if (! isBegin) { result.push_back("and"); }*/ result.push_back(tenToNinety[inners[1] - 1]); if (inners[0] > 0) { result.push_back(zeroToNine[inners[0]]); } } } // 一位数 else { if (! isBegin) { if (inners[0] > 0) { // result.push_back("and"); result.push_back(zeroToNine[inners[0]]); } } else { result.push_back(zeroToNine[inners[0]]); } } } int main() { int N; while (cin >> N) { int thousandPart = 0; vector<int> thousands; vector<string> result; while (N >= 1000) { thousands.push_back(N % 1000); N /= 1000; ++thousandPart; } thousands.push_back(N); if (thousandPart == 0) { // 1000以下 processThousand(N, result, true); } else { // 按1000分 最高位的部分 processThousand(thousands[thousandPart], result, true); result.push_back(thousandToBillion[thousandPart - 1]); // 中间部分 for (int i = thousandPart - 1; i >= 1; --i) { processThousand(thousands[i], result, false); if (thousands[i] > 0) { result.push_back(thousandToBillion[i - 1]); } } // 最后小于1000的部分 processThousand(thousands[0], result, false); } for (int i = 0; i < result.size() - 1; ++i) { cout << result[i] << " "; } cout << result[result.size() - 1] << endl; } return 0; }
import java.util.Scanner; /** * @author Yuliang.Lee * @version 1.0 * @date 2021/9/20 11:24 * 学英语: Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文: 如22:twenty two,123:one hundred and twenty three。 说明: 数字为正整数,长度不超过九位,不考虑小数,转化结果为英文小写; 输出格式为twenty two; 非法数据请返回“error”; 关键字提示:and,billion,million,thousand,hundred。 * 解题思路: a.先判断输入的数是否不超过9位,且不能有负号,不能含小数点,然后用0补足得到9位字符数组。 b.根据英文的数字表示法,每3个数字分隔为一组来处理,从左往右看: 1~3位数,计量单位为million 4~6位数,计量单位为thousand 7~9位数,计量单位为hundred and 十位-个位 (注意对10-19的英文单词额外处理) c.million和thousand单位中的个十百的计数法则同7~9位数。 d.最后将整合后的结果进行输出。 * 示例: 输入:2356 (2,356) 输出:two thousand three hundred and fifty six 输入:123000123 (123,000,123) 输出:one hundred and twenty three million one hundred and twenty three 输入:1000000 (1,000,000) 输出:one million */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String figure = in.nextLine(); if (isLegal(figure)) { char[] digits = String.format("%09d", Integer.parseInt(figure)).toCharArray(); StringBuilder output = new StringBuilder(); for (int i = 0; i < 9; i += 3) { String tmpResult = transferHundredsDigit(digits, i, i + 3); if (tmpResult != null && tmpResult.length() != 0) { output.append(tmpResult); switch (i) { case 0: output.append("million "); break; case 3: output.append("thousand "); break; case 6: output.append(" "); break; default: break; } } } if (output.length() == 0) { output.append("zero "); } System.out.println(output.substring(0, output.length() - 1)); } else { System.out.println("error"); } } } /** * 合法性校验 * @param figure * @return */ public static boolean isLegal(String figure) { if (figure.length() > 9 || figure.contains("-") || figure.contains(".")) { return false; } return true; } /** * 个十百的转换 * @param digits * @return */ public static String transferHundredsDigit(char[] digits, int start, int end) { boolean hasAnd = false; boolean isTeen = false; StringBuilder result = new StringBuilder(); for (int i = start; i < end; i++) { // 当十位为1时 if (isTeen) { result.append(transferTeen(digits[end - 1])); break; } // 百位和个位 if (i == start || i == end - 1) { switch (digits[i]) { case '0': break; case '1': result.append("one "); break; case '2': result.append("two "); break; case '3': result.append("three "); break; case '4': result.append("four "); break; case '5': result.append("five "); break; case '6': result.append("six "); break; case '7': result.append("seven "); break; case '8': result.append("eight "); break; case '9': result.append("nine "); break; default: break; } if (i == start && digits[i] != '0') { hasAnd = true; result.append("hundred "); } } // 十位 else { if (hasAnd && (digits[i] != '0' || digits[i + 1] != '0')) { result.append("and "); } switch (digits[i]) { case '0': break; case '1': isTeen = true; break; case '2': result.append("twenty "); break; case '3': result.append("thirty "); break; case '4': result.append("forty "); break; case '5': result.append("fifty "); break; case '6': result.append("sixty "); break; case '7': result.append("seventy "); break; case '8': result.append("eighty "); break; case '9': result.append("ninety "); break; default: break; } } } return result.toString(); } /** * 10~19对应的英文单词转译 * @param number * @return */ public static String transferTeen(char number) { switch (number) { case '0': return "ten "; case '1': return "eleven "; case '2': return "twelve "; case '3': return "thirteen "; case '4': return "fourteen "; case '5': return "fifteen "; case '6': return "sixteen "; case '7': return "seventeen "; case '8': return "eighteen "; case '9': return "nineteen "; default: return ""; } } }
//每3位处理一次,并对3位进行翻译 import java.util.*;
public class Main{ public static String[] bit_num = {"zero","one","two","three","four","five","six","seven","eight","nine"}; public static String[] ten_num = {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"}; public static String[] twenty_more = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"}; public static String parse(long num){ if(num < 0) return "error"; StringBuffer sb = new StringBuffer(); long billion = num / 1000000000; if(billion != 0){ sb.append(trans(billion) + " billion "); } num %= 1000000000; long million = num / 1000000; if(million != 0){ sb.append(trans(million) + " million "); } num %= 1000000; long thousand = num / 1000; if(thousand != 0){ sb.append(trans(thousand) + " thousand "); } num %= 1000; long hundred = num; if(hundred != 0){ sb.append(trans(hundred)); } return sb.toString().trim(); } public static String trans(long num){ StringBuffer sb = new StringBuffer(); int h = (int)(num / 100); if(h != 0){ sb.append(bit_num[h] + " hundred"); } num %= 100; int t = (int)(num / 10); if(t != 0){ if(h != 0){ sb.append(" and "); } if(t == 1){ sb.append(ten_num[(int)(num%10)]); } else{ sb.append(twenty_more[(int)(t - 2)] + " "); if(num % 10 != 0){ sb.append(bit_num[(int)(num%10)]); } } } else if(num % 10 != 0){ if(h != 0){ sb.append(" and "); } sb.append(bit_num[(int)(num%10)]); } return sb.toString().trim(); } public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ long num = in.nextLong(); System.out.println(parse(num)); } in.close(); } }
#没用字典,用的列表,有些边界值额外处理了以下 def spk(number): #每3位数分开处理 list1 = ["","one","two","three","four","five","six","seven","eight","nine","ten"] list2 = ["","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"] list3 = ["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"] if number < 11: #处理 1-10 r = list1[number] elif 10 < number < 20: #处理 11-19 r = list2[number%10] elif 19 < number < 100: #处理 20-99 r = list3[number//10] + " " + list1[number%10] elif number == 100: # 单独处理 100,用字典就没这么麻烦 r = "one hundred" else: #处理 101-999,方法和上面一样 h = list1[number//100] + " hundred and" if number%100 < 11: t = list1[number%100] elif 10 < number%100 < 20: t = list2[number%100%10] elif 19 < number%100 < 100: t = list3[number%100//10] + " " + list1[number%100%10] r = h + " " + t #把结果组合起来 return r #返回结果 while True: try: strs = input() if len(strs) < 4: #只有3位的情况 number = int(strs) res = spk(number) print(res) elif 3 < len(strs) < 7: # 有4-6位的情况 number = int(strs)//1000 r1 = spk(number) number = int(strs)%1000 r2 = spk(number) res = r1 + " thousand " + r2 #因为前面函数是每3位一组,现在组合结果 res = res.replace(" "," ") #因为用的前面列表,会有双空格的情况,额外处理 print(res) elif 6 < len(strs) < 8: #7位数的情况 number = int(strs)//1000000 r1 = spk(number) number = int(strs)%1000000//1000 r2 = spk(number) number = int(strs)%1000000%1000 r3 = spk(number) res = r1 + " million " + r2 + " thousand " + r3 #因为前面函数是每3位一组,现在组合结果 res = res.replace(" "," ") #因为用的前面列表,会有双空格的情况,额外处理 print(res) except: break#还是觉得很复杂,倒是挺好理解
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); // 预设字典 String[] dic1 = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; String[] dic2 = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; String[] dic3 = {"zero","ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; String[] dic4 = {"", "thousand", "million", "billion"}; while(in.hasNextLine()){ // 输入的处理 String num = in.nextLine(); StringBuilder res = new StringBuilder(); String zero = ""; if((num.length() % 3) != 0){ for(int i = 0; i < (3 - num.length() % 3); i++){ zero += "0"; } } num = zero + num; // 每三个一位进行处理,最多处理到billion int n = num.length(); int i = 0; List<String> list = new ArrayList<>(); while(n >= 3){ StringBuilder builder = new StringBuilder(); String str = num.substring(n - 3, n); int a = str.charAt(0) - '0'; int b = str.charAt(1) - '0'; int c = str.charAt(2) - '0'; boolean aIsZero = false; boolean bIsZero = false; boolean cIsZero = false; // 百位 if(a != 0){ builder.append(dic1[a] + " hundred"); }else{ aIsZero = true; } if(!aIsZero && (b != 0 || c != 0)){ builder.append(" and"); } String kongge = aIsZero ? "" : " "; // 十位 if(b != 0){ if(b == 1){ int temp = b * 10 + c - 10; builder.append(kongge + dic2[temp]); }else{ builder.append(kongge + dic3[b] + (c == 0 ? "" : (" " + dic1[c]))); } }else{ bIsZero = true; } // 个位 if(c != 0){ if(bIsZero){ builder.append(kongge + dic1[c]); } }else{ cIsZero = true; } // 最后的单位 if(!aIsZero || !bIsZero || !cIsZero){ builder.append((i == 0 ? "" : " ") + dic4[i]); list.add(builder.toString()); } // 更新索引 n -= 3; i++; } // 输出的处理 for(int j = list.size() - 1; j >= 0; j--){ if(j != 0){ res.append(list.get(j) + " "); }else{ res.append(list.get(j)); } } System.out.println(res); } } }
import java.util.Scanner; public class Main { public static String[] ones = new String[]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; public static String[] teens = new String[]{"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; public static String[] tys = new String[]{"zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; public static String[] hundreds = new String[] {"hundred", "thousand", "million", "billion"}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { System.out.println(numToEn(sc.next())); } } // 数字转英文 public static String numToEn(String num) { String temp; // 个位 if (num.length() == 1) { return ones[num.charAt(0)-48]; } // 十位 if (num.length() == 2) { if (num.startsWith("0")) { return ones[num.charAt(1)-48]; } if (num.startsWith("1")) { return teens[num.charAt(1)-48]; } else { temp = tys[num.charAt(0)-48]; if (num.endsWith("0")) { return temp; } else { return temp + " " + ones[num.charAt(1)-48]; } } } // 百位(递归) 注意:hundred后用and来连接 if (num.length() == 3) { if (num.startsWith("0")) { return numToEn(num.substring(1)); } temp = numToEn(num.substring(0, 1)) + " " + hundreds[0]; if (num.endsWith("00")) { return temp; } else { return temp + " and " + numToEn(num.substring(1)); } } // 千位(递归) if (num.length() < 7) { if (num.startsWith("0")) { return numToEn(num.substring(1)); } temp = numToEn(num.substring(0, num.length()-3)) + " " + hundreds[1]; if (num.endsWith("000")) { return temp; } else { return temp + " " + numToEn(num.substring(num.length()-3)); } } // 百万位(递归) if (num.length() < 10) { if (num.startsWith("0")) { return numToEn(num.substring(1)); } temp = numToEn(num.substring(0, num.length()-6)) + " " + hundreds[2]; if (num.endsWith("000000")) { return temp; } else { return temp + " " + numToEn(num.substring(num.length()-6)); } } // 十亿位(递归) temp = numToEn(num.substring(0, num.length()-10)) + " " + hundreds[3]; if (num.endsWith("000000000")) { return temp; } else { return temp + " " + numToEn(num.substring(num.length()-10)); } } }
//3位一处理,这道题好tm烦人,写了几个小时!!! import java.util.Scanner; public class Main{ private static String[] ge = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; private static String[] shi = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; private static String[] teen = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen","nineteen"}; public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ long num = sc.nextLong(); String s = toEnglish(num); System.out.println(s); } } //转为英语,3位一起处理 private static String toEnglish(long num){ String str = String.valueOf(num); StringBuilder sb = new StringBuilder(); int len = str.length(); int m=len/3, n=len%3; int sep = 0; for(; sep<m; sep++){ String s = str.substring(len-3-3*sep,len-3*sep); sb.insert(0,english1(s, sep)); } if(n!=0) sb.insert(0, english2(str.substring(0, n), sep)); return sb.toString(); } //处理三位数 private static String english1(String s, int i){ StringBuilder sb = new StringBuilder(); char c1 = s.charAt(0); char c2 = s.charAt(1); char c3 = s.charAt(2); if(c1=='0' && c2=='0' && c3=='0') return ""; if(c1!='0') sb.append(ge[c1-'0'-1]).append(" hundred"); if(c2!='0' || c3!='0'){ if(c1!='0') sb.append(" and "); if(c2=='1') sb.append(teen[c3-'0']); else if(c2=='0') sb.append(ge[c3-'0'-1]); else{ sb.append(shi[c2-'0'-2]); if(c3!='0'){ sb.append(" ").append(ge[c3-'0'-1]); } } } switch(i){ case 0: break; case 1: sb.append(" ").append("thousand ");break; case 2: sb.append(" ").append("million ");break; case 3: sb.append(" ").append("billion ");break; default: ; } return sb.toString(); } //处理剩余数字 private static String english2(String s, int i){ StringBuilder sb = new StringBuilder(); int len = s.length(); if(len==1) sb.append(ge[s.charAt(0)-'0'-1]); else{ int c1 = s.charAt(0); int c2 = s.charAt(1); if(c1=='1') sb.append(teen[c2-'0']); else{ if(c2=='0') sb.append(shi[c1-'0'-2]); else{ sb.append(shi[c1-'0'-2]).append(" ").append(ge[c2-'0'-1]); } } } switch(i){ case 0: break; case 1: sb.append(" ").append("thousand ");break; case 2: sb.append(" ").append("million ");break; case 3: sb.append(" ").append("billion ");break; default: ; } return sb.toString(); } }
#include<iostream> #include<string> using namespace std; string g_strNum[] = { "zero","one","two","three","four","five","six","seven","eight", "nine","ten","eleven","twelve","thirteen","fourteen", "fifteen","sixteen","seventeen","eighteen","nighteen" }; string g_strTenDigit[] = { "twenty","thirty","forty","fifty","sixty","seventy", "eighty","ninety" }; string g_strUnit[] = { "hundred","thousand","million","billion" }; string EnglishChange(const string& s) { string tmp; if (s.empty()) return tmp; int num = stoi(s); if (num < 20) tmp = g_strNum[num]; else if (num < 100) { tmp = g_strTenDigit[num / 10 - 2]; if (0 != num % 10) tmp += " " + g_strNum[num % 10]; } else { if (100 == num) tmp = g_strNum[1] + " " + g_strUnit[0]; else { tmp = g_strNum[num / 100] + " " + g_strUnit[0] + " and "; int iTen = num % 100; if (iTen < 20) tmp += g_strNum[iTen]; else { tmp += g_strTenDigit[iTen / 10 - 2]; if (0 != iTen % 10) tmp += " " + g_strNum[iTen % 10]; } } } return tmp; } int main() { const int LEN_Split = 4; string strIn; while (cin >> strIn) { if (strIn.size() > 12) break; for (auto it = strIn.begin(); it != strIn.end(); ++it) { if (!isdigit(*it)) // 判断是否有非数字字符 { cout << "error" << endl; return 0; } } string strSplit[LEN_Split]; int index = 0; for (auto it = strIn.rbegin(); it != strIn.rend(); ++it) { if (strSplit[index / 3].empty()) // 三个一组 strSplit[index / 3].push_back(*it); else strSplit[index / 3].insert(strSplit[index / 3].begin(), *it); // 插入前面 ++index; } string strChange[LEN_Split]; for (int i = 0; i < LEN_Split; ++i) { if (!strSplit[i].empty()) { strChange[i] = EnglishChange(strSplit[i]); } } for (int i = LEN_Split - 1; i >= 0; --i) { if (!strChange[i].empty()) { if (0 != i) cout << strChange[i] << " " << g_strUnit[i] << " "; else cout << strChange[i]; } } cout << endl; } return 0; }
lt20 = "one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen seventeen eighteen nineteen".split() tens = "twenty thirty forty fifty sixty seventy eighty ninety".split() def trans(n): if n < 20: return lt20[n - 1: n] # 小于20的直接查找枚举 if n < 100: return [tens[n//10 - 2]] + trans(n % 10) # 大于等于20小于100的,十位查枚举,个位递归继续查枚举 if n < 1000: if n % 100 == 0: return [lt20[n // 100 - 1]] + ["hundred"] # 整百处理 return [lt20[n//100 - 1]] + ["hundred"] + ["and"] + trans(n % 100) for i, unit in enumerate(["thousand", "million", "billion"], 1): # 这三个单位按10的3次方递增 if n < pow(1000, i + 1): return trans(n // pow(1000, i)) + [unit] + trans(n % pow(1000, i)) while True: try: num = int(input()) print(" ".join(trans(num)) if num > 0 else "zero") except: break
#include<iostream> using namespace std; string ones[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; string tens[] = { "ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nighteen" }; string twenties[] = { "zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety" }; int ihundreds[] = { 100, 1000, 1000000, 1000000000}; string hundreds[] = { "hundred", "thousand", "million", "billion" }; string iTostr(long long n) { if(n>=0&&n<10) {return ones[n];} else if(n>=10&&n<20) {return tens[n%10];} else if(n>=20&&n<100) {return twenties[n/10]+(n%10 ?" "+ ones[n%10]:"");} for(int i=0;i<3;i++) { if(n<ihundreds[i+1]) { return iTostr(n/ihundreds[i])+" "+hundreds[i]+(n%ihundreds[i]? (i? " ":" and ")+iTostr(n%ihundreds[i]):""); } } return ""; } int main() { long long n; while(cin>>n) { cout<<iTostr(n)<<endl; } return 0; }
import java.util.*; public class Main{ private static HashMap<Integer, String> map = new HashMap<Integer,String>(); static{ map.put(1,"one"); map.put(2,"two"); map.put(3,"three"); map.put(4,"four"); map.put(5,"five"); map.put(6,"six"); map.put(7,"seven"); map.put(8,"eight"); map.put(9,"nine"); map.put(10,"ten"); map.put(11,"eleven"); map.put(12,"twelve"); map.put(13,"thirteen"); map.put(14,"fourteen"); map.put(15,"fifteen"); map.put(16,"sixteen"); map.put(17,"seventeen"); map.put(18,"eighteen"); map.put(19,"nineteen"); map.put(20,"twenty"); map.put(30,"thirty"); map.put(40,"forty"); map.put(50,"fifty"); map.put(60,"sixty"); map.put(70,"seventy"); map.put(80,"eighty"); map.put(90,"ninety"); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { long num = sc.nextLong(); ArrayList<String> res = new ArrayList<String>(); int cnt = 0; while(num != 0) { res.addAll(read((int)(num%1000))); num = num / 1000; if(num == 0) break; if(cnt == 0) { res.add("thousand"); }else if(cnt == 1) { res.add("million"); }else if(cnt == 2) { res.add("billion"); } cnt += 1; } for(int i = res.size() - 1; i >= 0; i--) { System.out.print(res.get(i) + " "); } System.out.println(); } } private static List<String> read(int num) { ArrayList<String> list = new ArrayList<String>(); int x = num % 100; if(x < 20 && x > 0) { list.add(map.get(x)); }else if(x >= 20) { int g = x % 10; int s = x - g; if(g != 0) list.add(map.get(g)); list.add(map.get(s)); } int b = num / 100; if(b != 0){ list.add("and"); list.add("hundred"); list.add(map.get(b)); } return list; } }
while True: try: to19 = 'one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen seventeen eighteen nineteen'.split() tens = 'twenty thirty forty fifty sixty seventy eighty ninety'.split() num = input() n = len(num) def hundred(num): #print(num) ans = '' ten = num % 100 num = num // 100 if 0<ten < 20: ans = to19[ten-1] elif ten > 20 and ten % 10 != 0: ans = tens[(ten-20)//10] +' ' +to19[(ten%10)-1] else: ans = tens[(ten-20)//10] if num % 10 != 0: ans = to19[(num % 10)-1]+' ' +'hundred '+'and ' + ans return ans index = 0 ans = '' pos = ['','thousand','million'] while n-index*3-3>0: tmp = hundred(int(num[n-index*3-3:n-index*3])) ans = tmp+' '+ pos[index]+' ' + ans index += 1 #print(index) tmp = hundred(int(num[:n-index*3])) ans = tmp + ' '+ pos[index]+' ' + ans print(ans) except: break代码是这个样子的,想问问大家为什么不加while True,try和except就连输出都没有啊?
// 测试用例通过90%,但感觉测试用例好像不太对,比如1538088 //答案输出:one million five hundred and thirty eight thousand eighty eight //程序输出:one million five hundred and thirty eight thousand and eighty eight(翻译软件也是这样的) #include <stdlib.h> #include <stdio.h> #include <string.h> char* onePos[] = {"one", "two", "three", "four", "five", "six", \ "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",\ "fifteen", "sixteen", "seventee", "eighteen", "nineteen"}; char* tenPos[] = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; void handleThreePos(int val, int flag) { int ten = val % 100; int hun = val % 1000 / 100; if(flag) printf(" "); if(hun) { printf("%s hundred", onePos[hun - 1]); } if(ten && hun) printf(" and "); else if(ten && flag) printf("and "); if(ten > 19) { int tt = ten / 10; int tg = ten % 10; if(tg) { printf("%s %s", tenPos[tt - 2], onePos[tg - 1]); } else { printf("%s", tenPos[tt - 2]); } } else if(ten > 0) { printf("%s", onePos[ten - 1]); } } void do_thousand(int val) { if(val) { handleThreePos(val / 1000, 0); printf(" thousand"); handleThreePos(val % 1000, 1); } } void do_millon(int val) { handleThreePos(val / 1000000, 0); printf(" million "); do_thousand(val % 1000000); } int main(void) { char num[10]; while(scanf("%s", num) != EOF) { int val = atoi(num); int len = (int)strlen(num); if(len > 6) { do_millon(val); } else if(len > 3) { do_thousand(val); } else { handleThreePos(val, 0); } printf("\n"); } return 0; }
import java.util.*; public class Main { private static final String[] tens = {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; private static final String[] less_than_20 = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; private static final String[] thousands = {"", "thousand", "million", "billion"}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { long num = sc.nextLong(); System.out.println(translate(num)); } sc.close(); } public static String translate(long num) { if (num == 0) { return "zero"; } String res =""; int i = 0; while (num > 0) { if (num % 1000 != 0) { long curr = num % 1000; res = numToString(curr) + thousands[i] + " " + res; } num /= 1000; i++; } return res.trim(); } public static String numToString(long num) { if (num == 0) { return ""; } else if (num < 20) { return less_than_20[(int)num] + " "; } else if (num < 100) { return tens[(int)(num / 10)] + " " + numToString((int)(num % 10)); } else { return less_than_20[(int)(num / 100)] + " hundred and " + numToString((int)(num % 100)); } } }
#0是非法数据,因此用空格做占位符 s0_19 = ' one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighth nineteenth'.split(' ') s20_90 = 'twenty thirty forty fifty sixty seventy eighty ninety'.split(' ') def num2words(n): if n <= 0: return('error') elif n < 20: return(str(s0_19[n])) elif n < 100 and n%10 == 0: #整十处理 return(str(s20_90[n//10 - 2])) elif n < 100: return(str(s20_90[n//10 - 2]+' '+num2words(n%10))) elif n < 1000 and n%100 == 0: #整百处理 return(str(num2words(n//100)+' hundred')) elif n < 1000: return(str(num2words(n//100)+' hundred and '+num2words(n%100))) #三位数必带and elif n < 1000000 and n%1000%100 == 0: return(str(num2words(n//1000)+' thousand')) elif n < 1000000: return(str(num2words(n//1000)+' thousand '+num2words(n%1000))) #这里有缺陷,中间有零要拼接“and”,但是此处没考虑(如2020,但还是通过了),下同 elif n < 1000000000 and n%1000000%1000 == 0: return(str(num2words(n//1000000)+' million')) elif n < 1000000000: return(str(num2words(n//1000000)+' million '+num2words(n%1000000))) else: return('error') while True: try: print(num2words(int(input())).strip()) except:break
import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Scanner; import java.util.logging.LoggingMXBean; public class Main { public static HashMap<Long, String> ji = new LinkedHashMap<>(); public static HashMap<Long, String> shiji = new LinkedHashMap<>(); public static HashMap<Long, String> jishi = new LinkedHashMap<>(); static { ji.put(0L, "zero"); ji.put(1L, "one"); ji.put(2L, "two"); ji.put(3L, "three"); ji.put(4L, "four"); ji.put(5L, "five"); ji.put(6L, "six"); ji.put(7L, "seven"); ji.put(8L, "eight"); ji.put(9L, "nine"); shiji.put(10L, "ten"); shiji.put(11L, "eleven"); shiji.put(12L, "twelve"); shiji.put(13L, "thirteen"); shiji.put(14L, "fourteen"); shiji.put(15L, "fifteen"); shiji.put(16L, "sixteen"); shiji.put(17L, "seventeen"); shiji.put(18L, "eighteen"); shiji.put(19L, "nineteen"); jishi.put(2L, "twenty"); jishi.put(3L, "thirty"); jishi.put(4L, "forty"); jishi.put(5L, "fifty"); jishi.put(6L, "sixty"); jishi.put(7L, "seventy"); jishi.put(8L, "eighty"); jishi.put(9L, "ninety"); } public static String hundred = "hundred"; public static String thousand = "thousand"; public static String million = "million"; public static String billion = "billion"; public static String and = "and"; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { try { long purpose = scanner.nextLong(); if (purpose < 0) { System.out.println("error"); continue; } if (purpose == 0) { System.out.println("zero"); } String spurpose = purpose + ""; if (spurpose.length() > 9) { System.out.println("error"); continue; } String lastpart = sanweishu(purpose % 1000); if (purpose / 1000 > 0) { String th = sanweishu((purpose / 1000) % 1000); if (th.length() > 0) { lastpart = th + " " + thousand + " " + lastpart; } } if (purpose / 1000000 > 0) { lastpart = sanweishu((purpose / 1000000)) + " " + million + " " + lastpart; } System.out.println(lastpart); } catch (Exception e) { System.out.println("error"); } } scanner.close(); } public static String sanweishu(long l) { if (l == 0) { return ""; } StringBuilder sBuilder = new StringBuilder(); long last1 = l % 10; long last2 = l % 100; long first = l / 100; long second = (l / 10) % 10; if (first != 0) { sBuilder.append(ji.get(first)).append(" ").append(hundred).append(" "); } if (last2 != 0) { if (sBuilder.length() > 0) { sBuilder.append(and).append(" "); } if (second == 0) { sBuilder.append(ji.get(last1)); } else if (second == 1) { sBuilder.append(shiji.get(last2)); } else { if (last1 == 0) { sBuilder.append(jishi.get(second)); } else { sBuilder.append(jishi.get(second)).append(" ").append(ji.get(last1)); } } } return sBuilder.toString().trim(); } }
#include <stdio.h> #include <string.h> #include <stdlib.h> char index_units[10][16] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; char index_ten[10][16] = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; char index_tens[10][16] = { "heihei", "heihei", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; char *parse_2(int num) { int n; char res[100]; char *p; if(0<=num && num<10) { strcpy(res, index_units[num]); n = strlen(res); } else if(10<=num && num<20) { strcpy(res, index_ten[num-10]); n = strlen(res); } else if(20<=num && num<100) { strcpy(res, index_tens[num/10]); n = strlen(res); if((num%10) != 0) { res[n] = ' '; strcpy(res+n+1, index_units[num%10]); n = strlen(res); } } else { printf("parse_2: error input\n"); while(1); } p = (char *)malloc(n+1); strcpy(p, res); return p; } char *parse_3(int num) { int n; char res[100]; char *p; if(0<=num && num<100) { p = parse_2(num); strcpy(res, p); free(p); n = strlen(res); } else if(100<=num && num<1000) { strcpy(res, index_units[num/100]); n = strlen(res); res[n] = ' '; strcpy(res+n+1, "hundred"); n = strlen(res); if(num%100 != 0) { res[n] = ' '; strcpy(res+n+1, "and "); n += 5; p = parse_2(num%100); strcpy(res+n, p); free(p); n = strlen(res); } } else { printf("parse_3: error input\n"); while(1); } p = (char *)malloc(n+1); strcpy(p, res); return p; } char *parse(int num) { int nn; int tmp; char *p; int n; char res[100]; nn = 0; tmp = num; while(tmp) { nn++; tmp /= 10; } if(nn == 0) { strcpy(res, "zero"); n = strlen(res); } else if(1<=nn && nn<=3) { p = parse_3(num); strcpy(res, p); free(p); n = strlen(res); } else if(4<=nn && nn<=6) { p = parse_3(num/1000); strcpy(res, p); free(p); n = strlen(res); res[n] = ' '; strcpy(res+n+1, "thousand"); n = strlen(res); if(num%1000) { res[n] = ' '; p = parse_3(num%1000); strcpy(res+n+1, p); free(p); n = strlen(res); } } else if(7<=nn && nn<=9) { p = parse_3(num/1000000); strcpy(res, p); free(p); n = strlen(res); res[n] = ' '; strcpy(res+n+1, "million"); n = strlen(res); if((num%1000000)/1000) { res[n] = ' '; p = parse_3((num%1000000)/1000); strcpy(res+n+1, p); free(p); n = strlen(res); res[n] = ' '; strcpy(res+n+1, "thousand"); n = strlen(res); } if((num%1000000)%1000) { res[n] = ' '; p = parse_3((num%1000000)%1000); strcpy(res+n+1, p); free(p); n = strlen(res); } } p = (char *)malloc(n+1); strcpy(p, res); return p; } int main() { int n; int res; char *p; while(1) { res = scanf("%d", &n); if(res == EOF) break; p = parse(n); printf("%s\n", p); free(p); } }
# include <stdio.h> # include <stdlib.h> # include <string.h> char s1[10][10] = { {'\0' }, "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; char s2[10][10] = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; char s3[8][10] = { "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; char s4[3][10] = { {'\0'}, "thousand", "million" }; int main() { long int n; while (scanf("%ld", &n) != EOF) { if(n==0) { printf("zero\n"); continue; } else if(n<0||n>999999999) { printf("error\n"); continue; } char str[150] = { '\0' }; int a[9]; for (int i = 0; i < 9; i++) { a[i] = 0; } int i = 0; while (n > 0) { a[i++] = n % 10; n = n / 10; } for (i = 2; i >= 0; i-- ) { if (a[3 * i + 2] > 0) { strcat(str, s1[a[3 * i+2]]); strcat(str, " hundred "); if (a[3 * i + 1] + a[3 * i] > 0) strcat(str, "and "); } if (a[3 * i + 1] == 0) { if (a[3 * i] > 0) strcat(str, s1[a[3 * i]]); } else if (a[3 * i + 1] == 1) { strcat(str, s2[a[3 * i]]); } else { strcat(str, s3[a[3 * i+1]-2]); if (a[3 * i] > 0) { strcat(str, " "); strcat(str, s1[a[3 * i]]); } } if (a[3 * i + 1] + a[3 * i] > 0 && i>0) { strcat(str, " "); } if (a[3 * i + 2] + a[3 * i + 1] + a[3 * i] > 0) { strcat(str, s4[i]); if (i>0) strcat(str, " "); } } puts(str); } return 0; }
import java.util.*;
/**
* @author zhangxf0406
* 学英语
* million thousand分开处理
*/
public class Main {
public static boolean validate(String str){
//不能超过9位
if(str.length() > 9)
return false;
//不能有小数
String [] s1 = str.split("\\.");
if(s1.length != 1)
return false;
//每一位都是数字
char[] cc = str.toCharArray();
for(int i = 0 ; i < cc.length ; i++){
if(!Character.isDigit(cc[i]))
return false;
}
return true;
}
public static boolean parse(String str){
String[] table1 = {"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
String[] table2 = {"ten","eleven","twelve","thirteen","fourteen","fifteen",
"sixteen","seventeen","eighteen","nighteen"};
String[] table3 = {"twenty","thirty","forty","fifty",
"sixty","seventy","eighty","ninety"};
int a1 = Integer.parseInt(str)/100; //1
int a2 = Integer.parseInt(str)/10%10; //2
int a3 = Integer.parseInt(str)%10; //3
if(a1 == 0 && a2 == 0 && a3 == 0)
return false;
// System.out.println("a1:"+a1+"..a2:"+a2+"..a3:"+a3);
if(a1 != 0 ){
System.out.print(table1[a1]+" hundred");
if(a2 == 0){
if(a3 != 0)
System.out.print(" and " + table1[a3]);
}
else if(a2 == 1){
// if(a3 != 0)
System.out.print(" and "+table2[a3]);
}
else{
if(a3 != 0)
System.out.print(" and "+table3[a2-2]+" "+table1[a3]);
else
System.out.print(" and "+table3[a2-2]+" ");
}
}
if(a1 == 0){
if(a2 == 0){
System.out.print(table1[a3]);
}
else if(a2 == 1){
// if(a3 != 0)
System.out.print(table2[a3]);
}
else{
if(a3 != 0)
System.out.print(" and "+table3[a2-2]+" "+table1[a3]);
else
System.out.print(" and "+table3[a2-2]+" ");
}
}
return true;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String num = scanner.next();
if(!validate(num)){
System.out.println("error");
continue;
}
//补齐9位
int len = num.length();
while(len != 9){
num = "0" + num;
len++;
}
// System.out.println(num);
String str1 = num.substring(0,len - 6); // million
boolean flag1 = parse(str1);
if(flag1)
System.out.print(" million ");
String str2 = num.substring(len - 6 , len - 6 + 3);
// System.out.println();
boolean flag2 = parse(str2);
if(flag2)
System.out.print(" thousand ");
String str3 = num.substring(len - 6 + 3 , num.length());
parse(str3);
System.out.println("");
}
scanner.close();
}
} 不通过
Python的解法。使用递归来解,通过所有的测试了:
def numberToWords(num):
to19='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen seventeen eighteen nineteen'.split()
tens="twenty thirty forty fifty sixty seventy eighty ninety".split()
def words(n):
if n<20:return to19[n-1:n]
if n<100:return [tens[n//10-2]]+words(n%10)
if n<1000:
return [to19[n//100-1]]+["hundred"]+["and"]+words(n%100)
for p,w in enumerate(('thousand',"million","billion"),1):
if n<1000**(p+1):
return words(n//1000**p)+[w]+words(n%1000**p)
return " ".join(words(num)) or "Zero"
while True:
try:
print(numberToWords(int(input())))
except:break