http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:找出 只由 2、3、5、7的 i次方 组成的第k个数。
1 <=k <= 5842
并且告知了 The 5842nd humble number is 2000000000.
直接暴力....
法一:
用一个set 不断把里面的每个数去乘2 3 5 7 然后塞进去 处理2W个就绰绰有余了。。。
法二:
直接暴力 2^i * 3^j * 5^k * 7 ^z , 最大系数为30 。。把全部算出来,再去重排序也可以
法一代码:
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> using namespace std; set<__int64> sb; __int64 prime[5]={1,2,3,5,7}; set<__int64> ::iterator it; __int64 ans2[20000]; int main() { sb.clear(); sb.insert(1); int i; while(sb.size()<18000) { int len=sb.size(); for (it=sb.begin();it!=sb.end()&&len--;it++) { if (sb.size()>18000) break; for (i=1;i<=4;i++) { sb.insert((*it)*prime[i]); } } } int ok=0; for (it=sb.begin();it!=sb.end();it++) { ans2[++ok]=*it; } __int64 n; char tm[100]; while(scanf("%I64d",&n)!=EOF) { if (!n) break; itoa(n,tm,10); int j=0; while(tm[j]!=0) j++; j--; if (tm[j]=='1'&&tm[j-1]=='1'&&j>0) printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='2'&&tm[j-1]=='1'&&j>0) printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='3'&&tm[j-1]=='1'&&j>0) printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='1') printf("The %I64dst humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='2') printf("The %I64dnd humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='3') printf("The %I64drd humble number is %I64d.\n",n,ans2[n]); else printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); } return 0; }
法二代码:
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> using namespace std; __int64 ans[300005]; __int64 ans2[300005]; int main() { __int64 ok=0; __int64 tol=30; __int64 i1,i2,i3,i4; for (i1=0;i1<=tol;i1++) { for (i2=0;i2<=tol-i1&&i2<=19;i2++) { for (i3=0;i3<=tol-i1-i2&&i3<=13;i3++) { for (i4=0;i4<=13&&i4<=tol-i1-i2-i3;i4++) { ans[++ok]=pow(2.0,i1)*pow(3.0,i2)*pow(5.0,i3)*pow(7.0,i4); } } } } int i; int cun=0; for (i=1;i<=ok;i++) { if (ans[i]>0) //小于0的都溢出了。。。 { ans2[++cun]=ans[i]; } } sort(ans2+1,ans2+1+cun); unique(ans2+1,ans2+1+ok); __int64 n; char tm[100]; while(scanf("%I64d",&n)!=EOF) { if (!n) break; itoa(n,tm,10); int j=0; while(tm[j]!=0) j++; j--; if (tm[j]=='1'&&tm[j-1]=='1'&&j>0) printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='2'&&tm[j-1]=='1'&&j>0) printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='3'&&tm[j-1]=='1'&&j>0) printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='1') printf("The %I64dst humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='2') printf("The %I64dnd humble number is %I64d.\n",n,ans2[n]); else if (tm[j]=='3') printf("The %I64drd humble number is %I64d.\n",n,ans2[n]); else printf("The %I64dth humble number is %I64d.\n",n,ans2[n]); } return 0; }