刚见到这道题的时候自然想到的方法就是采用下面的函数,直接顺序判断某个数是不是ugly numbers,结果超时了
bool isUglyNumber(int a){
while(a%2==0){
a=a/2;
}
while(a%3==0){
a=a/3;
}
while(a%5==0){
a=a/5;
}
if(a==1) return true;
else return false;
}
超时的原因主要就是由于浪费了时间来处理和判断一些非ugly numbers,因此,想到的方法是指处理ugly numbers。由于ugly numbers都是由前面的ugly numbers乘以2、3或5构成的,因此,考虑用三个变量一次存储各自对应的当前位置的数字分别乘以2、3或5。选择其中最小的存入ugly numbers的数组中,并更新对应的临时变量。
完整的程序如下:
# include <iostream>
using namespace std;
//定义一个从三个变量中选择最小变量的函数
int minNumber(int a,int b,int c){
int min;
min=a;
if(b<a){
min=b;
if(c<b)
min=c;
}
else if(c<a){
min=c;
}
return min;
}
int main()
{
int a[1501];
int n;
a[1]=1;
int cur=1;
int n2,n3,n5,q2,q3,q5;//设置三个变量用于存储*2、*3、*8之后得到的变量,n2,n3,n5用来存储更新位置的序号
n2=n3=n5=1;
for(int i=2;i<=1500;i++){
q2=2*a[n2];
q3=3*a[n3];
q5=5*a[n5];
if(minNumber(q2,q3,q5)==q2)
{
a[i]=q2;
n2++;
}
if(minNumber(q2,q3,q5)==q3)
{
a[i]=q3;
n3++;
}
if(minNumber(q2,q3,q5)==q5)
{
a[i]=q5;
n5++;
}
}
while(cin>>n,n){
cout<<a[n]<<endl;
}
return 0;
}