hdu1058 Humble Number

数据超级BT的一个题,WA了 想不明白为什么错,看看别人的AC代码才知道,对于211这样的输出要用th,221要用st。那叫一个泪%>_<%
题意:依序打印出因子只有2,3,5,7的数。
这个题在这章一拿到题就想DP动态方程,楞了半天,怎么想都觉得不是DP。开始的时候想着从1-2000000000依次用筛选法,比较无奈的,无限超时。优化了一下还是不行。

后来的后来就想到因子只有4个,何不计算出所有的数值,然后sort一下。试试写了出来。结果就出现了文章头出现的悲剧,不过,还是被我AC~\(≧▽≦)/~啦啦啦

仔细想想DP也差不多,DP数组中存放的是严格递增的数。

 嘿嘿 吖飒 加油!!!

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int num2[31];
int num3[20];
int num5[14];
int num7[12];
int num[6000];
int len=0;
int Calculate()
{
	int i,j,k,w;
	num2[0]=1;
	//31,20,14,12都是计算出来的呀
	for(i=1;i<31;i++)
		num2[i]=num2[i-1]*2;
	num3[0]=1;
	for(i=1;i<20;i++)
		num3[i]=num3[i-1]*3;
	num5[0]=1;
	for(i=1;i<14;i++)
		num5[i]=num5[i-1]*5;
	num7[0]=1;
	for(i=1;i<12;i++)
		num7[i]=num7[i-1]*7;
	int x,y,z;
	for(i=0;i<31;i++)
	{
		for(j=0;j<20;j++)
		{
			if(2000000000/num2[i]<num3[j]) break;
			x=num2[i]*num3[j];
			for(k=0;k<14;k++)
			{
				if(2000000000/x<num5[k]) break;
				y=x*num5[k];
				for(w=0;w<12;w++)
				{
					if(2000000000/y<num7[w]) break;
					z=y*num7[w];
					num[len++]=z;
				}
			}
		}
	}
	return 0;
}
int main()
{
	int n;
	Calculate();
	sort(num,num+len);
	while(cin>>n&&n)
	{
		if(n%10==1&&n%100!=11) cout<<"The "<<n<<"st humble number is "<<num[n-1]<<"."<<endl;
		else if(n%10==2&&n%100!=12) cout<<"The "<<n<<"nd humble number is "<<num[n-1]<<"."<<endl;
		else if(n%10==3&&n%100!=13) cout<<"The "<<n<<"rd humble number is "<<num[n-1]<<"."<<endl;
		else cout<<"The "<<n<<"th humble number is "<<num[n-1]<<"."<<endl;
	}
	return 0;
}


你可能感兴趣的:(hdu1058 Humble Number)