解析:  枚举一定超时,需要打表来完成。因为所有的项都能是2,3,5,7的倍数,所以每一项都是前面某项的2倍,3倍,5倍或7倍。

   而究竟是前面多少项的多少倍需要记录4个变量来递推,另4个变量来确定。

     对于n,一般来说个位数是1为st,个位数为2是nd,个位数为3是rd;但是有例外,11, 12 ,13均为th,同时111,112,113均为th,除此之外,其他都是th;

 1 #include <stdio.h>
 2 /*经典的算法,做过就要掌握,不要依赖现成的解决方案*/
 3 /*参考网上代码*/
 4 static int _min(int a,int b,int c,int d);
 5 static void reserve(void);
 6 int humble[6000];
 7 int a1, a2, a3, a4;
 8 int e1, e2, e3, e4;
 9 int main()
10 {
11     int n;
12     reserve();
13     while(scanf("%d", &n) == 1 && n){
14         if(n%100==11)
15         printf("The %dth humble number is %d.\n",n,humble[n]);
16         else if(n%100==12)
17         printf("The %dth humble number is %d.\n",n,humble[n]);
18         else if(n%100==13)
19         printf("The %dth humble number is %d.\n",n,humble[n]);
20         else if(n%10==1)
21         printf("The %dst humble number is %d.\n",n,humble[n]);
22         else if(n%10==2)
23         printf("The %dnd humble number is %d.\n",n,humble[n]);
24         else if(n%10==3)
25         printf("The %drd humble number is %d.\n",n,humble[n]);
26         else
27         printf("The %dth humble number is %d.\n",n,humble[n]);
28     }
29     return 0;
30 }
31 /*求四个数的最小值*/
32 static int _min(int a,int b,int c,int d)
33 {
34     int min = a;
35     if(b < min)
36         min = b;
37     if(c < min)
38         min = c;
39     if(d < min)
40         min = d;
41     return min;
42 }
43 /*打表*/
44 static void reserve(void)
45 {
46     int i;
47     humble[1] = 1;
48     a1 = a2 = a3 = a4 = 1;
49     for(i = 2; i < 6000; i++){
50         e1 = humble[a1] * 2;  /*此时的a1就表示之前某数可以乘2而比目前的数大*/
51         e2 = humble[a2] * 3;  /*此时的a2就表示之前某数可以乘3而比目前的数大*/
52         e3 = humble[a3] * 5;  /*此时的a3就表示之前某数可以乘5而比目前的数大*/
53         e4 = humble[a4] * 7;  /*此时的a4就表示之前某数可以乘7而比目前的数大*/
54         humble[i] = _min(e1,e2,e3,e4); /*新的数当然就是以前数的倍数*/
55         if(humble[i] == e1)
56             a1++;
57         if(humble[i] == e2)
58             a2++;
59         if(humble[i] == e3)
60             a3++;
61         if(humble[i] == e4)
62             a4++;
63     }
64 }