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