题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:求只由2,3,5,7的乘积组成的数,输出格式见output
思路:开始想打表,后来打表超时。因为数据太大了10^9,所以可以考虑用已知的2,3,5,7来推出之后的数,而不是
逐个数判断。
dp思路:从1开始找2,3,5,7倍数中最小的那个,每次找一下哪个数乘了一次,那个数的指针+1;
注意:输出格式中11,12,13,不是st,nd,rd。
参考文章:https://blog.csdn.net/ydm1234/article/details/51534932
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long LL; LL dp[100100]; int main(void) { int i,n,a=1,b=1,c=1,d=1; dp[1]=1; for(i=2;i<=5842;i++) { dp[i]=min(dp[a]*2,min(dp[b]*3,min(dp[c]*5,dp[d]*7))); if(dp[i]==dp[a]*2) a++; if(dp[i]==dp[b]*3) b++; if(dp[i]==dp[c]*5) c++; if(dp[i]==dp[d]*7) d++; } while(~scanf("%d",&n)&&n) { int tp=n%10,t=n%100; printf("The "); if(tp==1&&t!=11) printf("%dst",n); else if(tp==2&&t!=12) printf("%dnd",n); else if(tp==3&&t!=13) printf("%drd",n); else printf("%dth",n); printf(" humble number is %lld. ",dp[n]); } return 0; }