取数字并输出其英文单词的算法
我想在C中制作一个程序,要求用户输入一个数字,然后用英文打印该数字。
例如:
if(INPUT == 1) then print ONE if(INPUT == 2) then print TWO
等等。 它可以使用switch-case制作,如果是,但它会使代码冗长。 对于少数数字它没关系,但是如果我们必须写入100,那么它将是冗长的。
是否有一个简短的算法或想法?
你可以使用下面的,但这打印只有数千。 我这样做是为了解决一些特定的编程问题。 这就是为什么我没有超过数千人。 但不难扩大数量。 此外,该程序仍然可以优化或更清晰。
#include #include void print(int num) { char digit [21][10] = { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; char tens [11][10] = { "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; char str[1000] = {0}; int prev=0, div=1000; strcpy(str, ""); while(div) { if ((num / div) % 10 > 0 || (div == 10 && (num%100) > 0)) { if (prev) { strcat(str, "and"); prev = 0; } switch(div) { case 1000: strcat(str, digit[(num / div) % 10]); strcat(str, "thousand"); prev = 1; break; case 100: strcat(str, digit[(num / div) % 10]); strcat(str, "hundred"); prev = 1; break; case 10: if ( (num%100) >= 10 && (num%100) <= 19) strcat(str, digit[num%100]); else { strcat(str, tens[(num%100)/10]); strcat(str, digit[num%10]); } break; } } div /= 10; } printf("%d %s\n", num, str); } int main(int argc, char **argv) { long sum = 0; int count = 0; if (argc <= 1) { fprintf(stderr, "wrong number of arguments\n"); return -1; } print(atoi(argv[1])); return 0; }
您可以使用它,它可以用于将前99个整数转换为单词。 它有点简单。 看一看:
void main() { int n,m,j; clrscr(); printf("Enter any number between 1 to 99 : "); scanf("%d",&n); printf("You entered "); if(n>0&&n<=10) goto one; else if (n>10&&n<20) { m=n%10; goto two; } else if(n>20&&n<100) { j=n/10; n=n%10; goto three; } two: switch(m) { case 1:printf("eleven "); break; case 2:printf("twelve "); break; case 3:printf("thirteen "); break; case 4:printf("fourteen "); break; case 5:printf("fifteen "); break; case 6:printf("sixteen "); break; case 7:printf("seventeen "); break; case 8:printf("eighteen "); break; case 9:printf("nineteen "); break; } three: switch(j) { case 2:printf("twenty "); goto one; case 3:printf("thirty "); goto one; case 4:printf("fourty "); goto one; case 5:printf("fifty "); goto one; case 6:printf("sixty "); goto one; case 7:printf("seventy "); goto one; case 8:printf("eighty "); goto one; case 9:printf("ninety "); goto one; } one: switch(n) { case 1:printf("one "); break; case 2:printf("two "); break; case 3:printf("three "); break; case 4:printf("four "); break; case 5:printf("five "); break; case 6:printf("six "); break; case 7:printf("seven "); break; case 8:printf("eight "); break; case 9:printf("nine "); break; case 10:printf("ten "); break; } getch(); }
希望这可以帮助。
只需使用递归。 我没有足够的时间来测试它,所以这段代码可能有问题,但您可以轻松扩展它。
public static void convertNum(int number) { String[] digit = { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; String[] tens = { "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; if (number > 0 && number < 20) System.out.print(digit[number]); else if (number / 1000000 > 0) { convertNum(number / 1000000); System.out.print(" million "); convertNum(number % 1000000); } else if (number / 100000 > 0) { convertNum(number / 100000); System.out.print(" lukh "); convertNum(number % 100000); } else if (number / 1000 > 0) { convertNum(number / 1000); System.out.print(" thousand "); convertNum(number % 1000); } else if (number / 100 > 0) { convertNum(number / 100); System.out.print(" hundred "); convertNum(number % 100); } else if (number / 10 >= 2) { System.out.print(" " + tens[number / 10] + " "); convertNum(number % 10); } } convertNum (9191197);
我很难想出一种自动化的好方法,但仍然很简短。 如果你知道终点(即你想要1-100),那么你可以这样做:
char* numberArray[101] = {'Zero', 'One', 'Two' ... , 'One Hundred'};
然后当你收到输入时,只需使用该数字来访问该数组索引,它就会吐出你的答案:
int input; cin >> input; // input = 5 cout << numberArray[input]; // outputs: Five
我道歉,如果我的语法错误,我已经做了PHP和javaScript这么久了,现在我不记得C语法那么好......
你需要的是一个递归函数,它在一个,十个,几个和千位之后调用自己。
例如。
num_to_string(num = 344384) { if( haslakh()) num_to_string(3);print("lakh"); if( hasthou()) num_to_string(44);print("thousand"); if( hashundrer()) num_to_string(38);print("hundred"); num_to_string(4); if( num is from 1 to 9 ) print one..nine; if( num if from 10 to 90 ) print ten to ninty; }
如果人类没有实现千千万万(抱歉:1000),我会感到惊讶。
所以我检查了Github并找到了至少一些 。
我没有贡献任何一个。
这就是我写的,这很容易扩展到任何大小。 我没有清理一些我能做的事情,但逻辑工作得非常好
import java.util.Arrays; import java.util.Scanner;
公共类NumReader {
static final String[] units = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; static final String[] tens = {"", null, "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; static final String[] teens = {"ten", "eleven", "twelve", "thrirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; static final String hundredSuffix = "hundred"; static final String[] suffixes = {"", "thousand", "million", "billion"}; static boolean isValid(int num) { return (num <= 1000000000 && num >= 0); } static String numToString(int inpNum) { return numToString(inpNum, String.valueOf(inpNum).toCharArray()); } static String numToString(int inpNum, char[] digits) { return numToString(inpNum, digits, false); } static String numToString(int inpNum, char[] digits, boolean firstCall) { StringBuilder b = new StringBuilder(); if (inpNum == 0 && firstCall) { return "zero"; } else if (inpNum < 10) { return units[inpNum]; } else if (inpNum < 20) { return teens[inpNum - 10]; } else if (inpNum < 100) { b.append(tens[digits[0] - '0']).append(" ").append(units[digits[1] - '0']); return b.toString(); } else if (digits.length == 3) { String sub = new String(Arrays.copyOfRange(digits, 1, 3)); b.append(units[digits[0] - '0']).append(" ") .append(hundredSuffix); sub = numToString(Integer.parseInt(sub), Arrays.copyOfRange(digits, 1, 3)); if (sub.equals("")) { b.append(sub); } else { b.append(" and ").append(sub); } return b.toString(); } else if (digits.length > 3) { int numSuffixes = digits.length / 3; int initCut = digits.length % 3; int i; String sub, opt = ""; for (i = 0; i < numSuffixes; i++) { int end = digits.length - 3 * i; sub = new String(Arrays.copyOfRange(digits, end - 3, end)); sub = numToString(Integer.parseInt(sub)); opt = (sub.equals("")) ? opt : (sub + " " + suffixes[i] + " " + opt); } if (initCut != 0) { sub = new String(Arrays.copyOfRange(digits, 0, initCut)); opt = numToString(Integer.parseInt(sub)) + " " + suffixes[i] + " " + opt; } return opt; } return ""; } public static void main(String[] args) { Scanner s = new Scanner(System.in); int num = s.nextInt(); if (isValid(num)) { System.out.println(numToString(num, String.valueOf(num).toCharArray(), true)); } else { System.out.println("Not a valid input, num <= 1000000000"); } }
}
我想改善kalyan的答案。 有2个错误:
- 单词之间没有空格。 例如:100将得到结果一百(没有空格)
- 在英语中,有数以千计,需要复数forms。 例如200 – >两百(结果需要’s’)
修改这样的代码将解决这些错误:
void print(int num) { char digit [21][10] = { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; char tens [11][10] = { "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; char str[1000] = {0}; int prev=0, div=1000; strcpy(str, ""); while(div) { if ((num / div) % 10 > 0 || (div == 10 && (num%100) > 0)) { if (prev) { strcat(str, " and"); prev = 0; } switch(div) { case 1000: if (strlen(str) > 0 && str[strlen(str) - 1] != ' ') strcat(str, " "); strcat(str, digit[(num / div) % 10]); if (((num / div) % 10) > 1) strcat(str, " thousands"); else strcat(str, " thousand"); prev = 1; break; case 100: if (strlen(str) > 0 && str[strlen(str) - 1] != ' ') strcat(str, " "); strcat(str, digit[(num / div) % 10]); if (((num / div) % 10) > 1) strcat(str, " hundreds"); else strcat(str, " hundred"); prev = 1; break; case 10: if ( (num%100) >= 10 && (num%100) <= 19) { if (strlen(str) > 0 && str[strlen(str) - 1] != ' ') strcat(str, " "); strcat(str, digit[num%100]); } else { if (strlen(str) > 0 && str[strlen(str) - 1] != ' ') strcat(str, " "); strcat(str, tens[(num%100)/10]); if (strlen(str) > 0 && str[strlen(str) - 1] != ' ') strcat(str, " "); strcat(str, digit[num%10]); } break; } } div /= 10; } printf("%d %s\n", num, str); }
这是另一种方式。 不确定优点效率与内存与速度的关系,但很容易添加代码来处理更多数字。
/* File : num_to_words_int.c * * Descr: Prints the equivalent number in words. '1' to 'one', etc. * This version takes the input and converts it to a numeric vs. * a string value. 345 vs. "345". Then uses modulus division to * count the number of digits. The count represents the places; * ie count=5 ==> 10,000 ,, 1,000 ,, 100 ,, 10 ,, 1 are the * words that will be needed. * * 300 => count=3 ==>three hundred * 30 => count=2 ==>thirtey * 3 => count=1 ==>three * 13 => count=2 ==>thirteen * 3456 => count=4 ==>three thousand four hundred fifty six * * [345], [34 5], [3 4], [3, [0] * * Debugging Option: * num_to_words_int.exe number option_mask * * 001 - print init remainder array * 010 - print filled remainder array * 100 - print count, index, remainder value * * Author: Gene Bradshaw * Date: 09-16-2016 */ #include #include #include #include
例子:
$>./num_to_words.exe -1000000 $>number: -1,000,000 $>negative one million $>./num_to_words.exe 123456789011 $>number: 123,456,789,011 $>one hundred twenty three billion four hundred fifty six million seven hundred eighty nine thousand eleven $>./num_to_words.exe 123456789012 $>number: 123,456,789,012 $>one hundred twenty three billion four hundred fifty six million seven hundred eighty nine thousand twelve $>./num_to_words.exe -123456789012 $>number: -123,456,789,012 $>negative one hundred twenty three billion four hundred fifty six million seven hundred eighty nine thousand twelve $>./num_to_words.exe 0 $>number: 0 $>zero $>./num_to_words.exe 1 $>number: 1 $>one