HDU1058——Humble Numbers

原来做过的一道题,有敲了一遍,就是个丑数。

两种思路:

①最官方的解法:

用dp思想
如果一个数是Humble Number,那么它的2倍,3倍,5倍,7倍仍然是Humble Number
定义a为第i个Humble Number
a[n]=min(2*a[i1],3*a[i2],5*a[i3],7*a[i4]), i1,i2,i3,i4在被选择后相互移动

 

View Code
#include <stdio.h>
#define N 5843

__int64 min(__int64 a, __int64 b)
{
return a < b ? a : b;
}
__int64 hnum[N];

int main()
{
int i, i1, i2, i3, i4, n;
hnum[1] = 1;
i1 = i2 = i3 = i4 = 1;
for(i=2;i<=N;i++)
{
hnum[i] = min(hnum[i1]*2, min(hnum[i2]*3, min(hnum[i3]*5, hnum[i4]*7)));
if(hnum[i] == hnum[i1]*2) i1 ++;
if(hnum[i] == hnum[i2]*3) i2 ++;
if(hnum[i] == hnum[i3]*5) i3 ++;
if(hnum[i] == hnum[i4]*7) i4 ++;
}
while(scanf("%d", &n) != EOF && n)
{
if(n%10==1&&n%100!=11)
printf("The %dst humble number is %d.\n", n, hnum[n]);
else if(n%10==2&&n%100!=12)
printf("The %dnd humble number is %d.\n", n, hnum[n]);
else if(n%10==3&&n%100!=13)
printf("The %drd humble number is %d.\n", n, hnum[n]);
else
printf("The %dth humble number is %d.\n", n, hnum[n]);
}
return 0;
}

②所谓的丑数就是因子只含2,3,5,7.若一个数n是丑数,则必定有n=2^a*3^b*5^c*7^d,因此只需求出所有的丑数,对其进行排序即可:

 

View Code
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 2000000000
int cmp(const void *a,const void *b)
{
return *(int *)a - *(int *)b;
}
int ans[5842];
int main()
{
int len = 0,n,a,b,c,d;
__int64 num2,num3,num5,num7;
for(a=0;a<=31;a++)
{
num2 = (__int64)pow(2.0,(double)a);
for(b=0;b<=20;b++)
{
num3 = (__int64)pow(3.0,(double)b);
if(num2*num3 > MAX)
break;
for(c=0;c<=14;c++)
{
num5 = (__int64)pow(5.0,(double)c);
if(num2*num3*num5 > MAX)
break;
for(d=0;d<12;d++)
{
num7 = (__int64)pow(7.0,(double)d);
if(num2*num3*num5*num7 <= MAX)
{
ans[len++] = num2*num3*num5*num7;
}
else
{
break;
}
}
}
}
}
qsort(ans,len,sizeof(ans[0]),cmp);
while(scanf("%d",&n)==1&& n)
{
if(n%10==1&&n%100!=11)
printf("The %dst humble number is %d.\n",n,ans[n-1]);
else if(n%10==2&&n%100!=12)
printf("The %dnd humble number is %d.\n",n,ans[n-1]);
else if(n%10==3&&n%100!=13)
printf("The %drd humble number is %d.\n",n,ans[n-1]);
else
printf("The %dth humble number is %d.\n",n,ans[n-1]);
}
return 0;
}


posted @ 2011-11-27 19:47  1050768624  阅读(226)  评论(0编辑  收藏  举报