丑数问题,要防止超时

就是能被分解成2,3,5,7的数就是丑数啦。 

#define MAX 99999					//数组最大值
int uglyNum(int n) {
	int uglys[MAX] = {1};				//保存丑数数组
	int count = 1;							//因有一个数,所以从1开始
	//1的情况另做判断
	if (n == 1) {
		return 1;
	}
	while (1) {
		int chooseTwo = 0;				//记录和2相乘的数据
		int chooseThree = 0;			//记录和3相乘的数据
		int chooseFive = 0;				//记录和5相乘的数据
		for (int i = 0; i < count; i++) {					//循环前面丑数和2相乘
			if (uglys[i] * 2 > uglys[count - 1]) {		//找到第一个大于前一个的丑数,直接记录然后break
				chooseTwo = uglys[i] * 2;
				break;
			}
		}
		for (int i = 0; i < count; i++) {					//和2同理
			if (uglys[i] * 3 > uglys[count - 1]) {
				chooseThree = uglys[i] * 3;
				break;
			}
		}
		for (int i = 0; i < count; i++) {					//和2同理
			if (uglys[i] * 5 > uglys[count - 1]) {
				chooseFive = uglys[i] * 5;
				break;
			}
		}
		//比较三个数的大小,小的即为丑数,加入数组中
		int temp = chooseTwo <= chooseThree ? chooseTwo : chooseThree;
		uglys[count] = temp <= chooseFive ? temp : chooseFive;
		//计数器加一
		count++;
		//如果是第n个就直接返回
		if (count == n) {
			//数组最后一个元素下标是count-1
			return uglys[count - 1];
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值