解析: 枚举一定超时,需要打表来完成。因为所有的项都能是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 }