标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18238 Accepted Submission(s): 7934
说DP有点牵强,不过也算是用前面的状态推出后面的状态,英语知识是个易错点。
思路:2,5,7,9是丑数,丑数的2,5,7,9倍也是丑数,所以从1开始,对每个数计算计算它的2,5,7,9倍,算出来的结果又再翻倍。难免会遇到这种考察其它乱七八糟的知识点的题,输出时的后缀很容易错,在英语里如果一个数的个位是1,那后面跟st,2跟nd,3跟rd,其它跟th,但是注意,后面两位是11,12,13的除外,这些数后面都跟th,比如12,10013,1111,我WA了三次,算是英语差的后果吧。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define MAX 5845 5 6 int my_min(int a,int b,int c,int d); 7 int main(void) 8 { 9 int n; 10 int s[MAX] = {1}; 11 int i,i_2,i_3,i_5,i_7; 12 int box,box_2,box_3,box_5,box_7; 13 char cha[5]; 14 i = i_2 = i_3 = i_5 = i_7 = 0; 15 16 while(i < MAX - 2) 17 { 18 box_2 = s[i_2] * 2; 19 box_3 = s[i_3] * 3; 20 box_5 = s[i_5] * 5; 21 box_7 = s[i_7] * 7; 22 23 box = my_min(box_2,box_3,box_5,box_7); //每次把最小的那个插入到数组里,就不用排序了 24 if(box == box_2) //要一直用if,因为结果可能相同 25 i_2 ++; 26 if(box == box_3) 27 i_3 ++; 28 if(box == box_5) 29 i_5 ++; 30 if(box == box_7) 31 i_7 ++; 32 33 i ++; 34 s[i] = box; 35 } 36 37 while(scanf("%d",&n) && n) 38 { 39 box = n % 100; 40 if(box == 11 || box == 12 || box == 13) 41 { 42 strcpy(cha,"th"); 43 goto label; 44 } 45 46 box = n; 47 while(box / 10) 48 box %= 10; 49 switch(box % 10) 50 { 51 case 1:strcpy(cha,"st");break; 52 case 2:strcpy(cha,"nd");break; 53 case 3:strcpy(cha,"rd");break; 54 default :strcpy(cha,"th");break; 55 } 56 57 label: 58 printf("The %d%s humble number is %d.\n",n,cha,s[n - 1]); 59 } 60 61 return 0; 62 } 63 64 int my_min(int a,int b,int c,int d) 65 { 66 int min = a; 67 68 min = min < b ? min : b; 69 min = min < c ? min : c; 70 min = min < d ? min : d; 71 72 return min; 73 }
标签:
原文地址:http://www.cnblogs.com/xz816111/p/4178920.html