求从小到大的第1500个丑数

算法描述:

我们把只包含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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiluohan0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值