HDU-1058-Humble Numbers-暴力贪心

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


你可能感兴趣的:(HDU-1058-Humble Numbers-暴力贪心)