poj 2247 Humble Numbers

#include <iostream>
using namespace std;
int start[4],prime[5843]={1};
int factor[4]={2,3,5,7};
int main()
{
int i,j,min;
for(i=1;i<=5842;i++)
{
min
=2000000001;
for(j=0;j<4;j++)
if(prime[start[j]]*factor[j]<=min) //不要漏掉=的情况
min=prime[start[j]]*factor[j];
prime[i]
=min;
for(j=0;j<4;j++)
if(prime[start[j]]*factor[j]==min)
start[j]
++;
}
char suffix[4][3]={"st","nd","rd","th"};
int num,flag;
while(scanf("%d",&num)&&num)
{
if(num%10==1&&num%100!=11)
flag
=0;
else if(num%10==2&&num%100!=12)
flag
=1;
else if(num%10==3&&num%100!=13)
flag
=2;
else flag=3;
printf(
"The %d%s humble number is %d.\n",num,suffix[flag],prime[num-1]);
}
return 0;
}
//一个humble数的{2,3,5,7}的积一定是一个humble,那么找出他们其中最小的作为新的humble。
//为了加快搜索过程,可以使用一个素数集大小的数组记录这个素数与某个humble的积<=当前最大humble的最大的位置,这样可以过滤掉小的数,
//而且这个最大的humble的位置的下一个数和这个素数的乘积就是这个素数能产生的最小的未生成的humble,
//比较每个素数能产生的最小的humble,选一个最小的作为新的humble。

  

posted on 2011-07-20 22:50  sysu_mjc  阅读(136)  评论(0编辑  收藏  举报

导航