算法描述:
我们把只包含2,3和5的数称为丑数,求从小到大的第1500个丑数
算法实现:
/*************************************************************************
> File Name: main.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月20日 星期三 09时44分14秒
************************************************************************/
#include "IsUgly.h"
void Test(int index, int expected)
{
if (GetUglyNumber1(index) == expected)
printf("solution1 pass!\n");
else
printf("solution1 fail!\n");
if (GetUglyNumber2(index) == expected)
printf("solution2 pass!\n");
else
printf("solution2 fail!\n");
}
int main()
{
Test(1,1);
Test(10, 12);
Test(1500, 859963392);
return 0;
}
/*************************************************************************
> File Name: IsUgly.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月20日 星期三 09时02分21秒
************************************************************************/
#include "IsUgly.h"
int IsUgly(int number)
{
while (number%2 == 0)
number/=2;
while (number%3 == 0)
number/=3;
while (number%5 == 0)
number/=5;
return (number ==1)?1:0;
}
int GetUglyNumber1(int index)
{
if (index <= 0)
return 0;
int number = 0;
int uglyFound = 0;
while (uglyFound < index)
{
++number;
if (IsUgly(number))
++uglyFound;
}
return number;
}
int Min(int n1, int n2, int n3)
{
int min = (n1 < n2) ? n1 : n2;
min = (min < n3) ? min : n3;
return min;
}
int GetUglyNumber2(int index)
{
if (index <= 0)
return 0;
int *pUglyNumbers = (int *)malloc(index*sizeof(int));
pUglyNumbers[0] = 1;
int next = 1;
int *p2 = pUglyNumbers;
int *p3 = pUglyNumbers;
int *p5 = pUglyNumbers;
while (next < index)
{
int min = Min(*p2*2, *p3*3, *p5*5);
pUglyNumbers[next] = min;
while (*p2*2 <= pUglyNumbers[next])
++p2;
while (*p3*3 <= pUglyNumbers[next])
++p3;
while (*p5*5 <= pUglyNumbers[next])
++p5;
++next;
}
int ugly = pUglyNumbers[next-1];
if (pUglyNumbers != NULL)
free(pUglyNumbers);
return ugly;
}
/*************************************************************************
> File Name: IsUgly.h
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月20日 星期三 09时01分26秒
************************************************************************/
#ifndef _ISUGLY_H
#define _ISUGLY_H
#include <stdio.h>
#include <stdlib.h>
/*
* 我们把只包含2,3和5的数称为丑数,求从小到大的第1500个丑数
* */
int IsUgly(int number);
int GetUglyNumber1(int index);
int GetUglyNumber2(int index);
#endif
CC = gcc
CFLAGS = -g -O2 -Wall
%.o:%.c
$(CC) -o $@ -c $(CFLAGS) $<
main:main.o IsUgly.o
$(CC) main.o IsUgly.o -o main $(CFLAGS)
clean:
rm -rf *.o main