【剑指offer】之丑数


题目描述:

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。


分析:、

  每一个丑数必然是由之前的某个丑数与2,3或5的乘积得到的,这样下一个丑数就用之前的丑数分别乘以2,3,5,找出这三种最小的并且大于当前最大丑数的值,即为下一个要求的丑数。


 java代码实现:

 

	private static int GetUglyNumber(int index) {
		if(index <= 0)
			return 0;
		int [] uglynumbers = new int[index];
		uglynumbers[0] = 1;
		int nextugly = 1;
		
		int index2 = 0;
		int index3 = 0;
		int index5 = 0;
		
		while(nextugly < index) {
			int min = Min(uglynumbers[index2]*2, uglynumbers[index3]*3, uglynumbers[index5]*5);
			uglynumbers[nextugly] = min;
			while(uglynumbers[index2]*2 <= uglynumbers[nextugly])
				index2++;
			while(uglynumbers[index3]*3 <= uglynumbers[nextugly])
				index3++;
			while(uglynumbers[index5]*5 <= uglynumbers[nextugly])
				index5++;
			nextugly++;
		}
		return uglynumbers[nextugly - 1];
		
	}
	
	private static int Min(int num1,int num2, int num3) {
		int min = (num1 < num2) ? num1:num2;
		return (min < num3) ? min:num3;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值