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;
}