您的位置:首页 > 其它

寻找丑数

2014-08-08 16:19 302 查看
题目:我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 1500 个丑数。
思路:由2,3,5构造丑数,并且将已经构造好的排序,假设前n个已经是排好序的丑数,则下一个丑数,是前面所有的数*2,或*3,或*5的到的最小的数,*2得到的数有n个,但我们之用保留第一个大于数n的数,并记录下index2,下一次它的index2搜索也是从该索引之后就可以了,对于*3,*5都一样,记为index3,index5,这三个数分别是*2,*3,*5得到的大于目前第n个丑数的最小的数,所以从这三个数当中选择最小的数放在这个数组中,直到需要找的第1500个丑数。

以下为代码:

int findUgly(int n)
{
int arr[1500] = {};
int i, j, index2=0, index3=0, index5=0;
arr[0] = 1;
int min;

for (i = 1; i < n; i++)
{
j = index2;
while (j <= i && arr[j]*2 <= arr[i-1])
j++;
index2 = j;

j = index3;
while (j <= i && arr[j]*3 <= arr[i-1])
j++;
index3 = j;

j = index5;
while (j <= i && arr[j]*5 <= arr[i-1])
j++;
index5 = j;

min = arr[index2]*2 < arr[index3]*3 ? arr[index2]*2 : arr[index3]*3;
min = min < arr[index5]*5 ? min : arr[index5]*5;
arr[i] = min;
}
return arr[n-1];
}

int main()
{
int n;
scanf("%d\n", &n);
printf("第%d个丑数是:%d\n", n, findUgly(n));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: