【 OJ 】 HDOJ1058 18年12月22日20:00 [ 50 ]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QingCoffe/article/details/85217412

这题找规律我想了很多试了有的感觉很烦,参考了人家的思路很....OJBnice,所以我按照人家的思路写了一遍。

这题就是求丑数,丑数最小的因子由2,3,5,7组成,1 被定义为最小丑数

首先很重要的一点要说下,丑数一定是由丑数乘丑数所得  ( =  =.)!! 丑数定义说的很明确因子只含有2,3,5,7

2357可以理解为这个是丑数的最小倍数,假设一个丑数x存在,那么当前丑数x可以产生的丑数一定由乘2357产生,当前丑数x产

生的最小丑数不一定是当前序列所需要的....假设目前序列为 1 2 3 4 5 6 ,下一个需要的最小丑数为7(由1*7产生),但是6可以

产生的最小丑数一定是 6*2=12,但是12并不是当前序列所需要的最小丑数,就这个意思

所以解决方法就是:1和2357相乘会得到4个数(这4个数也是1所能产生的最小丑数),拿到4个中最小的一个1*2,2已经被放进

序列,说明1*2已经用完了,但是剩下的357迟早会用到,不动它们。这时候让2的指针index2去指向序列中的2的位置,因为2放

进了序列,这时候2也能产生4个最小的丑数,其他的不可能用到,因为2*(3.5.7)一定大于1*(3.5.7),但是2*2可能会被用到。

所以从2*2和1*3和1*5和1*7中选择一个最小的数字,并放入序列,然后移动指针,重复N-1次得到第N个丑数

注:其中2*3 和3 *2因为都等于6所以说明序列2 和序列3 产生的都被使用,所以2 和 3 的指针index2 index3都需要指向序列的下一个

下面是AC代码:

# include<iostream>
# include<algorithm>
//# include<Windows.h>
# define NMAX 10000
using namespace std;
int Res[NMAX] = {1};
int MIN(int a, int b, int c,int d) {
	return min((min(a, b)), (min(c, d)));//返回最小值
}
int main()
{
	//long start_time = GetTickCount(); //获取此程序段开始执行时间
	int index, index2, index3, index5, index7;
	index2 = index3 = index5 = index7 = 0;//初始化为0
	index = 1;
	int n; cin >> n;
	int temp;
	while (n) {
		while (index < n) {
			temp = MIN(Res[index2] * 2, Res[index3] * 3, Res[index5] * 5, Res[index7] * 7);
			if (temp == Res[index2] * 2)index2++;
			if (temp == Res[index3] * 3)index3++;
			if (temp == Res[index5] * 5)index5++;
			if (temp == Res[index7] * 7)index7++;
			Res[index++] = temp;
		}
		int m = n % 100;
		if(m==11||m==12||m==13)
			printf("The %dth humble number is %d.\n", n, Res[n-1]);
		else if(n%10==1)
			printf("The %dst humble number is %d.\n", n, Res[n-1]);
		else if(n%10==2)
			printf("The %dnd humble number is %d.\n", n, Res[n-1]);
		else if(n%10==3)
			printf("The %drd humble number is %d.\n", n, Res[n-1]);
		else 
			printf("The %dth humble number is %d.\n", n, Res[n-1]);
		//n带 11 12 13为th 剩下 1 st 2 nd 3 rd 
		cin >> n;
	}
//	long end_time = GetTickCount(); //获取此程序段开始执行时间
//	cout << "程序段运行时间:" << (end_time - start_time) << "ms!" << endl; //差值即执行时间
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/QingCoffe/article/details/85217412