状态转移方程 a[i]=min(2*a[b2],3*a[b3],5*a[b5],7*a[b7]).
注意序数词的结尾。
#include <iostream>
#include <algorithm>
using namespace std;
int a[500005],ans[500005];
int main()
{
ios::sync_with_stdio(false);
int n;
a[1]=1;
int b2=1,b3=1,b5=1,b7=1;
for(int i=2;i<=5842;i++)
{
int m=min(min(2*a[b2],3*a[b3]),min(5*a[b5],7*a[b7]));
a[i]=m;
if(m==2*a[b2]) b2++;
if(m==3*a[b3]) b3++;
if(m==5*a[b5]) b5++;
if(m==7*a[b7]) b7++;
}
while(cin>>n)
{
if(n==0) break;
cout<<"The "<<n;
if(n%10==1&&n%100!=11)
cout<<"st ";
else if(n%10==2&&n%100!=12)
cout<<"nd ";
else if(n%10==3&&n%100!=13)
cout<<"rd ";
else
cout<<"th ";
cout<<"humble number is ";
cout<<a[n]<<"."<<endl;
}
return 0;
}