面试OR笔试19——丑数

题目及要求

1.1 题目描述

只包含因子2、3和5的数称为丑数(Ugly Number),习惯上我们把1当做第一个丑数。求按从小到大顺序的第n(n > 0)个丑数。

 

2 解答

2.1 代码


bool isUgly(int n){
    while(!(n%2)) n /= 2;
	while(!(n%3)) n /= 3;
	while(!(n%5)) n /= 5;
    return n==1;
}

// 方案1
int getUglyNumber1(int index){
	if(index < 1) return 0;
	int n(0);
	while(index){
		++n;
		if(isUgly(n)) --index;
	}
	return n;
}

// 方案2, 需要额外空间,时间效率较高
int getUglyNumber2(int index){
	if(index < 1) return 0;
	int *pn = new int[index];
	pn[0] = 1;
	for(int k1(1),k2(0),k3(0),k5(0);k1<index;++k1){
		pn[k1] = min(2*pn[k2], min(3*pn[k3], 5*pn[k5]));
		while(2*pn[k2]<=pn[k1]) ++k2;
		while(3*pn[k3]<=pn[k1]) ++k3;
		while(5*pn[k5]<=pn[k1]) ++k5;
	}
	index = pn[index-1];
	delete[] pn;
	return index;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值