编程算法 - 丑数 代码(C)

丑数 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数.

可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果.

如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Min(int number1, int number2, int number3) {
	int min = (number1 < number2) ? number1 : number2;
	min = (min < number3) ? min : number3;

	return min;
}

int GetUglyNumber(int index) {
	if (index <= 0)
		return 0;
	int* pUglyNumbers = new int[index];
	pUglyNumbers[0] = 1;
	int nextUglyIndex = 1;

	int* pMultiply2 = pUglyNumbers;
	int* pMultiply3 = pUglyNumbers;
	int* pMultiply5 = pUglyNumbers;

	while (nextUglyIndex < index) {
		int min = Min(*pMultiply2*2, *pMultiply3*3, *pMultiply5*5);
		pUglyNumbers[nextUglyIndex] = min;
		while (*pMultiply2*2 <= pUglyNumbers[nextUglyIndex])
			++pMultiply2;
		while (*pMultiply3*3 <= pUglyNumbers[nextUglyIndex])
			++pMultiply3;
		while (*pMultiply5*5 <= pUglyNumbers[nextUglyIndex])
			++pMultiply5;

		++nextUglyIndex;
	}
	int ugly = pUglyNumbers[nextUglyIndex-1];
	delete[] pUglyNumbers;
	return ugly;

}
int main(void)
{
    int num = 5;
    int result = GetUglyNumber(num);
    printf("result = %d\n", result);

    return 0;
}

输出:

result = 5

编程算法 - 丑数 代码(C),布布扣,bubuko.com

时间: 2024-10-15 11:02:53

编程算法 - 丑数 代码(C)的相关文章

编程算法 - 分割数 代码(C)

分割数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个无差别的物品, 将它们划分成不超过m组, 求出划分方法数模M的余数. 比如: n=4的m=3个划分, result=4(1,1,2; 1,3; 2,2; 4) 使用动态规划(DP)方法, n的m划分a, 假设每一个i都有a, {a-1}的集合就是n-m的m划分; a=0时, 就是n的m-1划分. 递推公式: dp[i][j] = dp[i][j-i] + dp[i-1][j] 代

编程算法 - 部分和问题 代码(C)

部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定整数a1, a2, ..., an, 判断是否可以从中选出若干数, 使它们的和恰好为k. 解法很多, 最简单的解法是使用深度优先搜索, 时间复杂度O(2^n), 不是最优解法. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <s

编程算法 - 字符串相同 代码(Java)

字符串相同 代码(Java) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 实现一个算法, 确定一个字符串的所有字符是否全都不同. 假使不允许使用额外的数据结构, 又该如何处理. 解法1: 使用数据结构, 设置boolean数组, 把值(value)作为数组的索引(index), 判断数组是否重复. 解法2: 不使用数据结构, 可以通过位(bit)进行判断, 把每个字母映射2进制数的一位, 或运算("|")更新数字的位, 与运算("

编程算法 - 硬币问题 代码(C)

硬币问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有1, 5, 10, 50, 100, 500元硬币各若干枚, 现在要用这些硬币来支付A元, 最少需要多少枚硬币? 假定本题至少存在一种支付方案. 使用贪心算法, 优先选用最大的硬币, 并不断的调整硬币的数量. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gcc 4.8.1

编程算法 - 区间调度问题 代码(C)

区间调度问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n项工作, 每项工作分别在s时间开始, 在t时间结束. 对于每项工作可以选择参与与否, 如果参与, 则全程参与. 参与时间段不能重叠, 包括起始结束瞬间也不能重叠. 求最多能参与多少项工作? 使用贪心法, 策略是在可选工作中, 每次都选取结束时间最早的工作. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike

编程算法 - 二分图判定 代码(C)

二分图判定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每个顶点染色, 并且要使相邻的顶点颜色不同.  是否能最多用2种颜色进行染色. 没有重边和闭环. 即二分图问题. 使用深度优先搜索(dfs), 把顶点染成c, 然后相邻边染成-c. 如果相邻边被染色过, 且相同, 则图不是二分图; 如果所有边都被染色, 并且互不相同, 则是二分图. 进行多次搜索, 避免非连通图. 代码: /* * CppPrim

编程算法 - 背包问题(递归) 代码(C)

背包问题(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 即经典动态规划问题. 可以使用深度优先搜索, 把每个部分都遍历到, 选取最优解, 但不是最好的方法. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gc

编程算法 - 多重集组合数 代码(C)

多重集组合数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n种物品, 第i种物品有a个. 不同种类的物品可以互相区分, 但相同种类的无法区分. 从这些物品中取出m个, 有多少种取法? 求出数模M的余数. 例如: 有n=3种物品, 每种a={1,2,3}个, 取出m=3个, 取法result=6(0+0+3, 0+1+2, 0+2+1, 1+0+2, 1+1+1, 1+2+0). 使用动态规划(DP). 前i+1种物品取出j个 = 前i

编程算法 - 排序分割 代码(C)

排序分割 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 排序分割, 把一个数组分为, 大于k\小于k\等于k的三个部分. 可以使用快速排序的Partition函数, 进行处理, 把大于k的放在左边, 小于k的放在右边. 使用一个变量记录中间的位置, 则时间复杂度为O(3n/2). 代码: /* * main.cpp * * Created on: 2014.9.18 * Author: Spike */ /*eclipse cdt, gcc 4.