题干:https://vjudge.net/problem/ZOJ-1095
每个数字都判断会超时.
所以不能在0到100000000之间循环…
不如一个一个生成…放到a[]数组里
生成的顺序是从小到大,比较好理解的就是把生成出来的每一个数字都乘3乘5乘7乘2,找到最小的加到数组里
但这样太浪费,时间复杂度也很高.
可以记录,数组中那个元素已经乘过2了,那么下次就用她的下一个.
设计4个变量,p2,p3,p5,p7,记录已经乘到第几个元素了.然后比较a[p2]*2,a[p3]*3,a[p5]*5,a[p7]*7
哪个小就把哪个加入数组.
然后把p2,p3,p5或p7加一,
#include<iostream>
#include<cstdio>
using namespace std;
long long a[6000];
int main(){
int n = 2;
int p2 = 1,p3 = 1,p5=1,p7 = 1;
a[1]=1;
while(a[n]<99999999)
{
a[n]= min ( min(a[p5]*5,min(a[p2]*2,a[p3]*3)),a[p7]*7);
if (a[n] == a[p5]*5) p5++;
if (a[n] == a[p3]*3) p3++;
if (a[n] == a[p2]*2) p2++;
if (a[n] == a[p7]*7) p7++;
n++ ;
}
int t;
while(scanf("%d",&t)&&t != 0){
if (t % 10 ==1) printf("The %dst humble number is %d\n",t,a[t]);
else if (t % 10 ==2) printf("The %dnd humble number is %d\n",t,a[t]);
else if (t % 10 ==3) printf("The %drd humble number is %d\n",t,a[t]);
else printf("The %dth humble number is %d\n",t,a[t]);
}
return 0;
}