PKU1138 Ugly Numbers

刚见到这道题的时候自然想到的方法就是采用下面的函数,直接顺序判断某个数是不是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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值