题意:给出丑数的定义,只含有2,3,5,7这四个素数因子的数称为素数。求第n个丑数。
可以先观察几个丑数得出规律
1:dp[1]
2:min(1*2,1*3,1*5,1*7)
3:min(2*2,1*3,1*5,1*7)
4:min(2*2,2*3,1*5,1*7)
5:min(3*2,2*3,1*5,1*7)
6:min(3*2,2*3,2*5,1*7)
7:min(4*2,3*3,2*5,1*7)
8:min(4*2,3*3,2*5,2*7)
9:min(5*2,3*3,2*5,2*7)
然后ppt里面的方程也就好理解了
dp[i]=min(dp[p1]*2,dp[p2]*3,dp[p3]*5,dp[p4]*7)
如果选中了哪一个数,对应的伪指针移动1 注意上面的6的情况,如果有两个或两个以上的数和它相等,对应的伪指针都移动1
然后就是输出的问题了
1是first
2是second
3是third
4是fourth
----
11是eleventh
12是twelfth
13是thirteenth -----
这一题也是学习的---感觉它的转移方程有一点点不一样---用已经算出来的丑数去推出新的丑数--- 另外输出的时候看了半天(为什么要判断这么多次----5555)原来是因为序数词的后缀不一样(===5555555)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn=6000+5; 8 int dp[maxn]; 9 10 int min(int a,int b,int c,int d) 11 { 12 a=a<b?a:b; 13 b=c<d?c:d; 14 return a<b?a:b; 15 } 16 17 int main() 18 { 19 int n,i,p1,p2,p3,p4,dp1,dp2,dp3,dp4; 20 dp[1]=1; 21 p1=p2=p3=p4=1; 22 for(i=2;i<=5850;i++) 23 { 24 dp1=2*dp[p1]; 25 dp2=3*dp[p2]; 26 dp3=5*dp[p3]; 27 dp4=7*dp[p4]; 28 dp[i]=min(dp1,dp2,dp3,dp4); 29 if(dp[i]==dp1) p1++; 30 if(dp[i]==dp2) p2++; 31 if(dp[i]==dp3) p3++; 32 if(dp[i]==dp4) p4++; 33 } 34 while(scanf("%d",&n)!=EOF&&n) 35 { 36 if(n%10==1&&n%100!=11) 37 printf("The %dst humble number is %d. ",n,dp[n]); 38 else if(n%10==2&&n%100!=12) 39 printf("The %dnd humble number is %d. ",n,dp[n]); 40 else if(n%10==3&&n%100!=13) 41 printf("The %drd humble number is %d. ",n,dp[n]); 42 else 43 printf("The %dth humble number is %d. ",n,dp[n]); 44 } 45 return 0; 46 }