题目大意:
5 如果一个数的没有2,3,5,7以外的质因子,则这个数
6 称为Humble数。前几个Humble数为
7 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 820, 21, 24, 25, 27, ...
9 求第n个Humble数。
10 分析与解题思路:
11 Humble数没有2,3,5,7以外的质因子,则
12 令h[]记录已经求到的Humble数,假设已经求了num个。
13 则把所有h[]中的数乘以2,3,5,7得到的最小大于h[num]的
14 数就是下一个Humble数。但这样无疑会TLE。
15 Prim[4]={2,3,5,7}
16初始id[4]={1,1,1,1}
17其中id[k]为h[]中的下标。表示乘以2的Humble数在h[]中的下标。
18已经知道num个Humble数时,min{Prim[k]*H[id[k]},0<=k<=3,
19就是要找的下一个Humble数。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
ll num[5850];
ll min(ll a,ll b,ll c,ll d)
{
a=a>b?b:a;
c=c>d?d:c;
return a>c?c:a;
}
void work()
{
int i,j,id1=1,id2=1,id3=1,id4=1;
num[1]=1;
for(i=2;i<5843;i++)
{
num[i]=min(num[id1]*2,num[id2]*3,num[id3]*5,num[id4]*7);
if( num[i]==num[id1]*2)id1++;
if( num[i]==num[id2]*3)id2++;
if( num[i]==num[id3]*5)id3++;
if( num[i]==num[id4]*7)id4++;
}
}
int main()
{
int n;
work();
while(scanf("%d",&n)&&n)
{
if(n%10==1&&n%100!=11)
printf("The %dst humble number is %I64d.\n",n,num[n]);
else
if(n%10==2&&n%100!=12)
printf("The %dnd humble number is %I64d.\n",n,num[n]);
else
if(n%10==3&&n%100!=13)
printf("The %drd humble number is %I64d.\n",n,num[n]);
else
printf("The %dth humble number is %I64d.\n",n,num[n]);
}
return 0;
}
20 注意重复的情况。