首页 > 代码库 > 《Cracking the Coding Interview》——第17章:普通题——题目7

《Cracking the Coding Interview》——第17章:普通题——题目7

2014-04-28 23:28

题目:给定一个数字,用英语把它读出来。

解法:ZOJ上有相反的题目。如果我要用中文读书来呢?

代码:

  1 // 17.7 Read an integer in English.
  2 #include <map>
  3 #include <string>
  4 using namespace std;
  5 
  6 map<int, string> m;
  7 
  8 void init()
  9 {
 10     m[0] = "zero";
 11     m[1] = "one";
 12     m[2] = "two";
 13     m[3] = "three";
 14     m[4] = "four";
 15     m[5] = "five";
 16     m[6] = "six";
 17     m[7] = "seven";
 18     m[8] = "eight";
 19     m[9] = "nine";
 20     m[10] = "ten";
 21     m[11] = "eleven";
 22     m[12] = "twelve";
 23     m[13] = "thirteen";
 24     m[14] = "fourteen";
 25     m[15] = "fifteen";
 26     m[16] = "sixteen";
 27     m[17] = "seventeen";
 28     m[18] = "eighteen";
 29     m[19] = "nineteen";
 30     m[20] = "twenty";
 31     m[30] = "thirty";
 32     m[40] = "forty";
 33     m[50] = "fifty";
 34     m[60] = "sixty";
 35     m[70] = "seventy";
 36     m[80] = "eighty";
 37     m[90] = "ninety";
 38     int i, j;
 39     for (i = 2; i <= 9; ++i) {
 40         for (j = 1; j <= 9; ++j) {
 41             m[i * 10 + j] = m[i * 10] + "-" + m[j];
 42         }
 43     }
 44 }
 45 
 46 void readNumber(int n)
 47 {
 48     if (n == 0) {
 49         return;
 50     }
 51     // here n is limited between [0, 999];
 52     int a, b, c;
 53     
 54     a = n / 100;
 55     b = n % 100 / 10;
 56     c = n % 10 / 1;
 57     
 58     if (a > 0) {
 59         printf("%s hundred ", m[a].c_str());
 60         if (b != 0 || c != 0) {
 61             printf("and ");
 62         }
 63     }
 64     if (b * 10 + c > 0) {
 65         printf("%s ", m[b * 10 + c].c_str());
 66     }
 67 }
 68 
 69 int main()
 70 {
 71     init();
 72     int n, n0;
 73     
 74     while (scanf("%d", &n) == 1) {
 75         if (n == 0) {
 76             printf("zero \n");
 77             continue;
 78         }
 79         if (n < 0) {
 80             printf("minus ");
 81             n = -n;
 82         }
 83         n0 = n;
 84         if (n >= 1000000000) {
 85             readNumber(n / 1000000000);
 86             printf("billion ");
 87             n = n % 1000000000;
 88         }
 89         if (n >= 1000000) {
 90             readNumber(n / 1000000);
 91             n = n % 1000000;
 92             printf("million ");
 93         }
 94         if (n >= 1000) {
 95             readNumber(n / 1000);
 96             n = n % 1000;
 97             printf("thousand ");
 98         }
 99         if (n0 >= 1000 && n / 100 == 0) {
100             printf("and ");
101         }
102         readNumber(n);
103         putchar(\n);
104     }
105     
106     return 0;
107 }