#include <iostream>
#include <queue>
#include <map>
#include <cstring>
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> >q;//优先队列,值小的元素优先
map<long long,bool> mark;//map判重
int main()
{
string sign;
long long js=1,re[5843],fx[4]={2,3,5,7};//re 存储结果
re[1]=1;
for(int i=0;i<4;i++)
q.push(fx[i]);
for(;js<=5842;)
{
long long t=q.top();
q.pop();
re[++js]=t;
for(int i=0;i<4;i++)
{
long long tmp=t*fx[i];
if(!mark[tmp])
{
mark[tmp]=true;//修改重复标记
q.push(tmp);
}
}
}
int n;
while(cin>>n)
{
if(n==0) break;
if(n%10==1&&n%100!=11)sign="st";
else if(n%10==2&&n%100!=12)sign="nd";
else if(n%10==3&&n%100!=13)sign="rd";
else sign="th";
cout<<"The "<<n<<sign<<" humble number is ";
cout<<re[n]<<"."<<endl;
}
}
下面是堆排序的做法:
#include <iostream>
#include <map>
#include <string>
using namespace std;
long long heap[90000];//建数组保存堆元素
int hlength;//保存堆的元素个数
void down(int p)
{
//向下调整算法,p代表当前节点,q代表子节点
int q=p*2;
long long a=heap[p];//保存当前节点的值
while (q<=hlength)
{
if (q<hlength&&heap[q]>heap[q+1])
//选择两个子节点中的一个最小的
q++;
if(heap[q]>=a) break;//如果子节点比当前节点大,就结束
else//否则就交换
{
heap[p]=heap[q];
p=q;
q=p*2;
}
}
heap[p]=a;//安排原来的节点
}
void up(int p)
{
//向上调整算法,p代表当前节点,而q代表父母节点
int q=p/2;//获取当前节点的父母节点
long long a=heap[p];//保存当前节点的值
while (q<=hlength&&a<heap[q])
{
//如果当前节点的值比父母节点的值小,就交换
heap[p]=heap[q];
p=q;
q=p/2;
}
heap[p]=a;//最后安排原来的节点
}
void insert(long long a)
{
heap[++hlength]=a;//先往堆里插入节点值
up(hlength);//进行向上调整
}
long long getmin()
{
//删除最小元素算法
long long r=heap[1];//取出最小的元素
heap[1]=heap[hlength--];//然后把最后一个叶子节点赋给根节点
down(1);//调用向下调整算法
return r;
}
void build()
{
//建堆算法
for(int i=hlength/2;i>0;i--)
down(i); //从最后一个非终端节点开始进行调整
}
int main()
{
map<long long,bool> mark;
string sign;
hlength=4;
long long re[5843];
re[1]=1;
int n,js=1;
heap[1]=2;heap[2]=3;
heap[3]=5;heap[4]=7;
int fx[4]={2,3,5,7};
while(js<5842)
{
long long tmp=getmin();
re[++js]=tmp;
for(int i=0;i<4;i++)
{
long long t=tmp*fx[i];
if(!mark[t])
{
mark[t]=true;
insert(t);
}
}
}
while(cin>>n)
{
if(n==0) break;
if(n%10==1&&n%100!=11)sign="st";
else if(n%10==2&&n%100!=12)sign="nd";
else if(n%10==3&&n%100!=13)sign="rd";
else sign="th";
cout<<"The "<<n<<sign<<" humble number is ";
cout<<re[n]<<"."<<endl;
}
}