题意:输出第n大的质因数只有2,3,5,7的数
分析:预处理满足这些条件的数,然后输出dp[n]就行,满足条件的数无非就是2,3,5,7不断的做乘积
这题的关键就是如何把这些乘积从小到大存入数组:设置四个计数器p2,p3,p5,p7完成这个任务
代码:
#include<iostream> #include<cstdio> #define min(a,b) (a<b?a:b) using namespace std; int n,dp[6000]; void check() { int p2,p3,p5,p7; p2=p3=p5=p7=1; dp[1]=1; int i=1; while(dp[i]<=2000000000){ int m1=min(2*dp[p2],3*dp[p3]); int m2=min(5*dp[p5],7*dp[p7]); int mi=min(m1,m2); dp[++i]=mi; if(dp[i]==2*dp[p2]) p2++; if(dp[i]==3*dp[p3]) p3++; if(dp[i]==5*dp[p5]) p5++; if(dp[i]==7*dp[p7]) p7++; } } int main() { check(); while(cin>>n){ if(!n) break; cout<<"The "<<n; if(n%100==11||n%100==12||n%100==13) cout<<"th"; else if(n%10==1) cout<<"st"; else if(n%10==2) cout<<"nd"; else if(n%10==3) cout<<"rd"; else cout<<"th"; cout<<" humble number is "<<dp[n]<<"."<<endl; } }
HDU 1058 Humble Numbers--DP--(计数器技巧)
原文地址:http://blog.csdn.net/ac_0_summer/article/details/46392117