版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}