求从小到大的第1500个丑数

算法描述:

我们把只包含2,3和5的数称为丑数,求从小到大的第1500个丑数

算法实现:

/*************************************************************************
	> File Name: main.c
	> Author: cyf
	> Mail: [email protected]
	> 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: [email protected]
	> 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: [email protected]
	> 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


你可能感兴趣的:(求从小到大的第1500个丑数)