#include <stdio.h>
#define min(a,b,c,d) (a<b?a:b)<(c<d?c:d)?(a<b?a:b):(c<d?c:d)
int a[10000];
int main()
{
a[1]=1;
int n;
int two=1,thr=1,fiv=1,sev=1;
for(int i=2;i<=5842;i++)
{
a[i]=min(2*a[two],3*a[thr],5*a[fiv],7*a[sev]);
if(a[i]/a[two]==2)
{
two++;
}
if(a[i]/a[thr]==3)
{
thr++;
}
if(a[i]/a[fiv]==5)
{
fiv++;
}
if(a[i]/a[sev]==7)
{
sev++;
}
}
while(scanf("%d",&n)&&n!=0)
{
char *b[20]={"th","st","nd","rd","th","th","th","th","th","th","th","th","th"};
printf("The %d",n);
if(n%100==12)
{
b[2]="th";
}
if(n%100==11)
{
b[1]="th";
}
if(n%100==13)
{
b[3]="th";
}
printf("%s",b[n%10]);
printf(" humble number is %d.\n",a[n]);
}
return 0;
}
已AC
既然是多组数据输入 那么先把humble number的表列出来然后直接查找就好了 这样只要运算一次就可以
状态转移方程a[i]=min(2*a[two],3*a[thr],5*a[fiv],7*a[sev])
既然有数是humblenumber那么他不管是乘2,3,5,7还是humblenumber ,比如a[1]=1,那么选择a[1]分别乘2,3,5,7,选择a[2]等于乘出来比较小的的那个数,a[2]=2;调用了2 那么下一次2就是乘以a[2]而不是a[1],依次类推每次调用数一次,那么那个数对应的数组下标就要加一,这样就可以存储到有序的humblenumber