hdu1058
题意:当一个数只有2、3、5、7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少;
其实并没有发现hdu把这道题放在 dp 专题里的意图,我的思路就是预处理出丑数数组,然后读入 n 就直接输出第 n 个丑数。我自己又一种想法,询问翔神之后又学到了另一种做法。
我自己的生成数组的方法是:数组的第一个元素定为1,然后用优先队列,首先将2,3,5,7放入优先队列,每次从队列中取出最小的一个数,将它放入数组中,然后分别将它乘上2,3,5,7后放入优先队列中,这样重复直到从队列中取出的数大于2000000000的时候就结束。对于处理重复元素,只要将优先队列中拿出的元素与数组中的上一次放入的数比较,如果相等就不进行操作,若不等则进行操作,这样就可以了。
1 #include<stdio.h>
2 #include<queue>
3 using namespace std;
4 #define LL long long
5 LL hum[10000],count=1;
6
7 void init(){
8 // printf("1111111111");
9 priority_queue<LL ,vector<LL>,greater<LL> >q;
10 q.push(2);
11 q.push(3);
12 q.push(5);
13 q.push(7);
14 hum[1]=1;
15 LL a=q.top();
16 q.pop();
17
18 while(a<=2000000000){
19 if(a!=hum[count]){
20 hum[++count]=a;
21 q.push(a*2);
22 q.push(a*3);
23 q.push(a*5);
24 q.push(a*7);
25 }
26 a=q.top();
27 q.pop();
28 }
29 return;
30 }
31
32 int main(){
33 // printf("1111111111");
34 init();
35 int n;
36 while(scanf("%d",&n)!=EOF&&n!=0){
37 printf("The %d",n);
38 if(n%100==11||n%100==12||n%100==13)printf("th ");
39 else if(n%10==1)printf("st ");
40 else if(n%10==2)printf("nd ");
41 else if(n%10==3)printf("rd ");
42 else printf("th ");
43 printf("humble number is %lld.
",hum[n]);
44 }
45 return 0;
46 }
翔神告诉我另一种做法,首先数组 hum[10000] 第一个元素还是1,然后定 a2 , a3 , a5 , a7 四个数分别表示 2 3 5 7 接下来要乘的数组元素的下标,起始都为 1 ,分别比较 2 * hum [ a2 ] , 3* hum [ a3 ] ,5 * hum [ a5 ] ,7 * hum [ a7 ] ,最小的一个放入数组,并将其对应的数组下标 a几 ++,重复直到超过2000000000
1 #include<stdio.h>
2 #define LL long long
3 LL hum[10000];
4
5 void init(){
6 hum[1]=1;
7 LL a2=1,a3=1,a5=1,a7=1,count=1;
8 while(hum[count]<2000000000){
9 LL min=3000000000;
10 if(2*hum[a2]<min)min=2*hum[a2];
11 if(3*hum[a3]<min)min=3*hum[a3];
12 if(5*hum[a5]<min)min=5*hum[a5];
13 if(7*hum[a7]<min)min=7*hum[a7];
14 hum[++count]=min;
15 if(2*hum[a2]==min)a2++;
16 if(3*hum[a3]==min)a3++;
17 if(5*hum[a5]==min)a5++;
18 if(7*hum[a7]==min)a7++;
19 }
20 return;
21 }
22
23 int main(){
24 init();
25 int n;
26 while(scanf("%d",&n)!=EOF&&n!=0i){
27 printf("The %d",n);
28 if(n%100==11||n%100==12||n%100==13)printf("th ");
29 else if(n%10==1)printf("st ");
30 else if(n%10==2)printf("nd ");
31 else if(n%10==3)printf("rd ");
32 else printf("th ");
33 printf("humble number is %lld.
",hum[n]);
34 }
35 return 0;
36 }