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.\n",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.\n",hum[n]); 34 } 35 return 0; 36 }
时间: 2024-08-06 11:58:26