一、问题描述
我们把只包含因子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];
}