输出的格式要注意一下,看了DISCUSS才AC。
/*
* hdu-1058 humnle numbers
* mike-w
* 2012-5-20
*/
#include<stdio.h>
#include<stdlib.h>
#define MAX_N 6543
#define MAX_HEAP_SIZE 100000
#define UPPER 2000000008
__int64 humble[MAX_N];
__int64 heap[MAX_HEAP_SIZE];
int heap_size;
int n;
int swap(__int64 *e1,__int64 *e2)
{
__int64 t=*e1;
*e1=*e2;
*e2=t;
return 0;
}
int heap_in(__int64 e)
{
if(heap_size==MAX_HEAP_SIZE)
return -1;
heap[++heap_size]=e;
__int64 p,x;
x=heap_size;
p=x/2;
while(p && heap[x]<heap[p])
{
swap(heap+x,heap+p);
x=p;
p=x/2;
}
return 0;
}
int heap_out(__int64 *e)
{
if(heap_size==0)
return -1;
*e=heap[1];
swap(heap+1,heap+heap_size);
heap_size--;
__int64 x,p,lc,rc;
p=1;
while(1)
{
lc=2*p;
rc=lc+1;
x=p;
if(lc<=heap_size && heap[lc]<heap[x])
x=lc;
if(rc<=heap_size && heap[rc]<heap[x])
x=rc;
if(x==p)
break;
swap(heap+x,heap+p);
p=x;
}
return 0;
}
int init(void)
{
heap_in(1);
int cnt=0,ret;
__int64 e;
while(cnt<MAX_N)
{
while(!(ret=heap_out(&e))&&e==humble[cnt])
;
if(ret)
break;
humble[++cnt]=e;
heap_in(2*e);
heap_in(3*e);
heap_in(5*e);
heap_in(7*e);
}
return 0;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int e;
init();
while(scanf("%d",&e),e)
{
printf("The %d",e);
if(e%10==1 && e%100!=11)
printf("st");
else if(e%10==2 && e%100!=12)
printf("nd");
else if(e%10==3 && e%100!=13)
printf("rd");
else
printf("th");
printf(" humble number is %I64d.\n",humble[e]);
}
return 0;
}