原题:http://acm.hdu.edu.cn/showproblem.php?pid=1058
思路:每次保留最小的数,注意输出格式;
#include<iostream>
#include<cstdio>
#include<algorithm>
#define Min(a, b, c, d) min(min(a, b), min(c, d))
using namespace std;
const int maxn = 6000;
int a[maxn];
int n;
void Init(){
a[1] = 1;
int p2 = 1, p3 = 1, p5 = 1, p7 = 1;
int cnt = 1;
while(1){
a[++cnt] = Min(2*a[p2], 3*a[p3], 5*a[p5], 7*a[p7]);
if(a[cnt] == 2*a[p2]) p2++;
if(a[cnt] == 3*a[p3]) p3++;
if(a[cnt] == 5*a[p5]) p5++;
if(a[cnt] == 7*a[p7]) p7++;
if(cnt == 5842) break;
}
}
int main(){
Init();
while(cin>>n && n){
if(n%10 == 1 && n%100 != 11) printf("The %dst humble number is %d.\n", n, a[n]);
else if(n%10 == 2 && n%100 != 12) printf("The %dnd humble number is %d.\n", n, a[n]);
else if(n%10 == 3 && n%100 != 13) printf("The %drd humble number is %d.\n", n, a[n]);
else printf("The %dth humble number is %d.\n", n, a[n]);
}
return 0;
}