两种方法求丑数

我们把只包含因子2、3和5的数称作丑数(Ugly
Number)。例如6、8都是丑数,但14不是,因为它包含因子7。

方法1 :

暴力破解,逐个判断

代码:

<pre name="code" class="cpp">#include <iostream>
#include <vector>

using namespace std;

//判断是否是丑数
bool isUgly(int index){
		while(index % 2 == 0){
			index /= 2;
		}
		while(index % 3 == 0){
			index /= 3;
		}
		while(index % 5 ==0){
			index /=5;
		}
		if(index == 1)
			return true;
		else
			return false;
}
int  print(int index){
	int count=1;
	int number = 0;
	int uglyFound =0;
	while(uglyFound < index){
		++number;
		if(isUgly(number)){
			++uglyFound;
		}
	}
	return number;
}

int main()
{
	cout<<print(1500);

    return 0;
}

运行结果:

方法2 : 采用空间换时间,只是判断丑数。一个丑数可以有另外一个丑数* 2 或者*3 或者*5 得到。

#include <iostream>
#include <vector>

using namespace std;

int Min(int pm2,int pm3,int pm5){
	int min = pm2 > pm3 ? pm3 : pm2;
	return min > pm5 ? pm5 : min;
}

void print(unsigned int index){
	if(index == 0)
		return;
	int * pUglyNumber = new int[index];
	int pNextIndex=1;
	pUglyNumber[0] = 1;
	int *pM2 = pUglyNumber;
	int *pM3 = pUglyNumber;
	int *pM5 = pUglyNumber;
	while(pNextIndex < index){
		int min=Min(*pM2 * 2,*pM3 * 3, *pM5 * 5);
		pUglyNumber[pNextIndex] = min;
		while(*pM2 * 2 <=pUglyNumber[pNextIndex])
			++pM2;
		while(*pM3 * 3 <=pUglyNumber[pNextIndex])
			++pM3;
		while(*pM5 * 5 <= pUglyNumber[pNextIndex])
			++pM5;
		pNextIndex ++;

	}
	int ugly = pUglyNumber[pNextIndex - 1];
	delete [] pUglyNumber;
	cout<< ugly;
}

int main()
{
	print(7);

    return 0;
}

运行结果:

两种方法求丑数,布布扣,bubuko.com

时间: 2024-12-22 22:03:44

两种方法求丑数的相关文章

HDU 1013 Digital Roots(两种方法,求数字根)

Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 67949    Accepted Submission(s): 21237 Problem Description The digital root of a positive integer is found by summing the digits of

归并排序,树状数组 两种方法求逆序对

我们知道,求逆序对最典型的方法就是树状数组,可是另一种方法就是Merge_sort(),即归并排序. 实际上归并排序的交换次数就是这个数组的逆序对个数,为什么呢? 我们能够这样考虑: 归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来. 在合并的过程中(设l<=i<=mid,mid+1<=j<=h).当a[i]<=a[j]时.并不产生逆序数:当a[i]>a[j]时.在 前半部分中比a[i]大的数都比a[j]

Math01: 两种方法求下三角矩阵的逆

方法一:单位矩阵消元 1 clear; 2 n = 500; 3 A = zeros(n,n); 4 for j = 1:n 5 for i = j:n 6 A(i,j) = (i + j)^2; 7 end 8 end 9 C = A; 10 B = eye(n); 11 12 for i = 1:(n-1) 13 B(i,:) = B(i,:)/A(i,i); 14 A(i,:) = A(i,:)/A(i,i); 15 for j = (i+1):n 16 B(j,:) = B(j,:) -

两种方法求最大公约数最小公倍数

<pre name="code" class="cpp">/* *coyright(c)2014 龙城无泪 *All rights reserved *文件名称 digui.c *作者:封尘之魂 *完成日期:20141108 *版本号V1.0 *问题描述:求两个整数的最大公约数最小公倍数 *输入描述:输入两个整数 *输出描述:成功输出最大公约数最小公倍数 */ #include<stdio.h> int main() {int m,n,q,t

字符串操作1 - 递归与非递归两种方法求字符串长度

1 //递归求字符串的长度 2 int RecurseLength(const char *str) 3 { 4 if(str == NULL || *str == '\0') 5 return 0; 6 7 if(*str == '\0') 8 return 0; 9 return RecurseLength(str+1) + 1;//返回当前字符数,再递归处理下一个字符 10 } 11 12 13 14 15 16 //非递归求字符串长度 17 int NonRecurseLength(co

Java编程:用两种方法求输入正整数的位数。

import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //把整数n转换为字符串求其长度 int len = Integer.toString(n).length(); System.out.println("用字符串的方式求其长度len="+len);

两种方法求单链表逆序

1 递归,非常easy 代码: #include<iostream> using namespace std; typedef struct node{ int data; struct node * pNext; }Node ,*pNode; void createNode(pNode & pHead){ int temp; scanf("%d",&temp); pNode p,q; bool isFirst = true; while(temp){ if

Java编程:用三目运算符和交换两种方法求三个数中的中间数字。

import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a =sc.nextInt(); int b =sc.nextInt(); int c =sc.nextInt(); int t=0; if(a>b) { t=a; a=b; b=t; } if(a>c) { t=a; a=c; c=t; }

设置Weblogic的线程数有两种方法

使用Weblogic版本:Weblogic 11g(10.3.6) 设置Weblogic的线程数有两种方法, 第一种,通过启动参数设置: 1 -Dweblogic.threadpool.MinPoolSize=1000 -Dweblogic.threadpool.MaxPoolSize=1000 可以加在setDomainEnv.sh文件JAVA_OPTIONS下面: 第二种,通过config.xml配置文件: 1 2 3 4 5 <server> <name>AdminServe