除了1之外的所有Humble Numbers的因子都只能是2、3、5、7中的一个或多个。
也就是所有的Humble Numbers都可由1乘以2、3、5、7中的某些数的某次幂得到。
建议不会做的童鞋可以模拟程序求出前几个数,就能明白该算法的思想。
比较蛋疼的是序数词的格式需要注意一下。
====================================
#include <stdio.h>
#include <math.h>
#include <utility>
using namespace std;
#define Max 6000
int min(int a,int b,int c,int d)
{
if(a<=b&&a<=c&&a<=d)
return 2;
if(b<=a&&b<=c&&b<=d)
return 3;
if(c<=a&&c<=b&&c<=d)
return 5;
if(d<=a&&d<=b&&d<=c)
return 7;
return 0;
}
int main()
{
long long ans[Max];
ans[1]=1;
int i2,i3,i5,i7,j;
i2=i3=i5=i7=1;
for(int i=2;i<=5842;i++)
{
j=min(ans[i2]*2,ans[i3]*3,ans[i5]*5,ans[i7]*7);
switch(j)
{
case 2:
ans[i]=ans[i2]*2;
i2++;
break;
case 3:
ans[i]=ans[i3]*3;
i3++;
break;
case 5:
ans[i]=ans[i5]*5;
i5++;
break;
case 7:
ans[i]=ans[i7]*7;
i7++;
break;
}
while(ans[i2]*2<=ans[i])i2++;
while(ans[i3]*3<=ans[i])i3++;
while(ans[i5]*5<=ans[i])i5++;
while(ans[i7]*7<=ans[i])i7++;
}
/*
freopen("out1.txt","w",stdout);
for(int i=1;i<=5842;i++)
printf("%d %I64d\n",i,ans[i]);
*/
int n;
while(scanf("%d",&n),n)
{
if(n%10==1&&n%100!=11)
printf("The %dst humble number is %I64d.\n",n,ans[n]);
else if(n%10==2&&n%100!=12)
printf("The %dnd humble number is %I64d.\n",n,ans[n]);
else if(n%10==3&&n%100!=13)
printf("The %drd humble number is %I64d.\n",n,ans[n]);
else
printf("The %dth humble number is %I64d.\n",n,ans[n]);
}
}