寻找丑数

7 篇文章 0 订阅
      题目:我们把只包含因子 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值