DP。
思路:从{d[p2]*2,d[p3]*3,d[p5]*5,d[p7]*7}这四个数中取出最小值,即为新的d[i]。
其中,p2,p3,p5,p7为指针(不是变量类型是指针,而是作用相当于指针)
需要考虑d[p2]*2=d[p3]*3以及其它相等的情况。
#include "stdio.h"
int main(){
int p2,p3,p5,p7,t2,t3,t5,t7;
int i,j,k,mini;
int d[6000];
d[1]=1;
p2=p3=p5=p7=1;
for(i=2;i<=5843;i++){
t2=d[p2]*2;
t3=d[p3]*3;
t5=d[p5]*5;
t7=d[p7]*7;
j=2;mini=t2;
if(t3==mini){
j+=20;
}
if(t3<mini){
j=3;mini=t3;
}
if(t5==mini)j+=100;
if(t5<mini){
j=5;mini=t5;
}
if(t7==mini)j+=1000;
if(t7<mini){
j=7;mini=t7;
}
switch(j){
case 2:p2++;break;
case 3:p3++;break;
case 5:p5++;break;
case 22:p2++;p3++;break;
case 7:p7++;break;
case 102:p2++;p5++;break;
case 1002:p2++;p7++;break;
case 103:p3++;p5++;break;
case 1003:p3++;p7++;break;
case 122:p2++;p3++;p5++;break;
case 1005:p5++;p7++;break;
case 1022:p2++;p3++;p7++;break;
case 1102:p2++;p5++;p7++;break;
case 1103:p3++;p5++;p7++;break;
case 1122:p2++;p3++;p5++;p7++;break;
default:break;
}
//printf("p2=%d, p3=%d, p5=%d, p7=%d\n",p2,p3,p5,p7);
//printf("t2=%d, t3=%d, t5=%d, t7=%d, Number=%d\n",t2,t3,t5,t7,mini);
//getchar();
d[i]=mini;
}
while(1){
scanf("%d",&k);
if(!k)break;
printf("The %d",k);
switch(k%10){
case 1:
if(k%100!=11)printf("st");else printf("th");
break;
case 2:
if(k%100!=12)printf("nd");else printf("th");
break;
case 3:
if(k%100!=13)
printf("rd");
else printf("th");
break;
default:printf("th");break;
}
printf(" humble number is %d.\n",d[k]);
}
return 0;
}