34-丑数

一、问题描述

我们把只包含因子2、3和5的数称作丑数,求按从小到大的顺序的第1500个丑数。例如6、8是丑数,但是14不是,因为它包含因子7.习惯上我们把1当做第一个丑数

二、解题思路

解法一:逐个判断数字是否为丑数
解法二:构建一个丑数数组,返回第1499位置上的元素

三、解题算法

解法一:逐个判断数字是否为丑数

/************************************************
author:tmw
date:2018-8-4
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/** 判断数字是否为丑数的函数
* @param number
**/
bool isUglyNumber(int number)
{
    while( number%2 == 0 )
        number = number/2;
    while( number%3 == 0 )
        number = number/3;
    while( number%5 == 0 )
        number = number/5;
    return number == 1? true:false;
}
/**方法一:逐个判断是否为丑数**/
int returnkthUglyNumber(int k)
{
    /**入参合法性校验**/
    if( k<=0 ) return 0;

    int number = 0;
    int uglyNumberCount = 0;

    while( uglyNumberCount < k )
    {
        number++;
        if( isUglyNumber(number) )
            uglyNumberCount++;
    }
    printf("number = %d\n",number);
    return number;
}

解法二:构建一个丑数的数组

/**方法二:构建一个丑数的数组
创建一个排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的
**/
int threeNumberFindMin( int a, int b, int c )
{
    int min = a < b ? a : b;
    return min < c ? min : c;
}

int createUglyNumber(int k)
{
    /**入参检查**/
    if(k<=0) return 0;

    int* uglyArray = (int*)malloc((k+2)*sizeof(int));
    /**题意:1为最小丑数**/
    uglyArray[0] = 1;

    /**定义三个游标分别做*2、*3、*5操作**/
    int index_multi_2 = 0;
    int index_multi_3 = 0;
    int index_multi_5 = 0;

    int i;
    int min;

    for( i=1; i<k; i++ )
    {
        min = threeNumberFindMin(uglyArray[index_multi_2]*2, uglyArray[index_multi_3]*3, uglyArray[index_multi_5]*5);
        uglyArray[i] = min;

        /**三个游标跟进**/
        while( uglyArray[index_multi_2]*2 <= uglyArray[i] )
            index_multi_2++;
        while( uglyArray[index_multi_3]*3 <= uglyArray[i] )
            index_multi_3++;
        while( uglyArray[index_multi_5]*5 <= uglyArray[i] )
            index_multi_5++;
    }
    printf("kth ugly number is:%d", uglyArray[k-1]);
    return uglyArray[k-1];
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值