HDU 丑数 - 1058 Humble Numbers

这一题是讲了一个名叫丑数的概念(为啥叫丑数,,)。

概念:因子中仅仅包含2、3、5,7的数,称为丑数。但其实我百度网上时,发现正常的丑数应该是因子中仅仅包含2、3、5,不过基本都一样。

我们可以通过不断mod2,3,5,7,直到无法在摸,验证此时是否为1来判断该数是否为丑数,但是这样的方法太过浪费时间,所以介绍一种新的方法,下面方法摘自这里点击打开链接

根据丑数的定义,丑数应该是另一个丑数乘以2、3,5或者7的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3,5或者7得到的。

这种思路的关键在于怎样确保数组里面的丑数是排好序的。我们假设数组中已经有若干个丑数,排好序后存在数组中。我们把现有的最大丑数记做M。现在我们来生成下一个丑数,该丑数肯定是前面某一个丑数乘以2、3,5或者7的结果。我们首先考虑把已有的每个丑数乘以2。在乘以2的时候,能得到若干个结果小于或等于M的。由于我们是按照顺序生成的,小于或者等于M肯定已经在数组中了,我们不需再次考虑;我们还会得到若干个大于M的结果,但我们只需要第一个大于M的结果,因为我们希望丑数是按从小到大顺序生成的,其他更大的结果我们以后再说。我们把得到的第一个乘以2后大于M的结果,记为M2。同样我们把已有的每一个丑数乘以3,5和7,能得到第一个大于M的结果M3,M5,M7。那么下一个丑数应该是M2、M3,M5和M7四个数的最小者。

前面我们分析的时候,提到把已有的每个丑数分别都乘以2、3,5和7,事实上是不需要的,因为已有的丑数是按顺序存在数组中的。对乘以2而言,肯定存在某一个丑数T2,排在它之前的每一个丑数乘以2得到的结果都会小于已有最大的丑数,在它之后的每一个丑数乘以2得到的结果都会太大。我们只需要记下这个丑数的位置,同时每次生成新的丑数的时候,去更新这个T2。对乘以3,5和7而言,存在着同样的T3,T5和T7。

就这题而言,我们正好可以通过上面的方法算出前5842个丑数,然后根据输入的值来输出相应位置的丑数。

#include<stdio.h>
#define min(x,y)(x<y?x:y)
int data[5850];

void get(int n) {
        data[0] = 1;
        int T2 = 0;
        int T3 = 0;
        int T5 = 0;
		int T7 = 0;
        int index = 0;
        while (index < n) {
            index++;
			int d1=min(data[T2] * 2, data[T3] * 3);
			int d2=min(data[T5] * 5, data[T7] * 7);
            int d = min(d1,d2);
            data[index] = d;
            while (data[T2] * 2 == data[index]) T2++;
            while (data[T3] * 3 == data[index]) T3++;
            while (data[T5] * 5 == data[index]) T5++;
			while (data[T7] * 7 == data[index]) T7++;
        }
 }
int main(){
	int i,n;
	get(5845);
	while(scanf("%d",&n)&&n!=0){
		printf("The ");
		if(n%10==1&&n%100!=11)printf("%dst",n);
		else if(n%10==2&&n%100!=12)printf("%dnd",n);
		else if(n%10==3&&n%100!=13)printf("%drd",n);
		else printf("%dth",n);
		printf(" humble number is %d.\n",data[n-1]);
	}
}

时间: 2024-10-26 19:58:50

HDU 丑数 - 1058 Humble Numbers的相关文章

HDU 1058 Humble Numbers(DP,数)

题意  所有只能被2,3,5,7这4个素数整除的数称为Humble Number  输入n  输出第n个Humble Number 1是第一个humble number  对于一个Humble Number  a  有2*a,3*a,5*a,7*a都是Humble Number  可以以1为基数  依次展开即可得到一定范围内的Humble Number 用i,j,k,l分别记录 2,3,5,7分别乘到了第几个Humble Number  当前在计算第cnt个Humble Number  那么有

HDU 1058 Humble Numbers (打表)

题目链接:HDU 1058 Humble Numbers 题意:一些数他们的素数因子只有2,3,5,7.求这些数. 因为这些数的因子只可能是2,3,5,7.所以通过2,3,5,7这个四个数构造这个数列,这个数列靠后的数必定是前面的数乘上2,3,5,7得到. AC代码: #include<stdio.h> #include<set> #define ll __int64 using namespace std; set<ll> s; set<ll>::iter

HDU 1058 Humble Numbers (dp+打表)

先是想筛法素数表啊,然后1~2000000000枚举打表啊,结果越想越不对. 后来想到唯一分解定理,可是怎么实现呢..果然还是需要努力啊.. 研究了discuss代码,码之~ ~~~~ dp的思想,若dp[i]是Humble Numbers,那么dp[i]*2,dp[i]*3,dp[i]*5,dp[i]*7都将是Humble Numbers. 所以只需要注意连续性便好了. #include<cstdio> #include<algorithm> #include<cmath&

HDU 1058 Humble Numbers &amp;&amp; NOJ 1420 丑数 (数位dp)

Humble Numbers                          Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                          Total Submission(s): 18555    Accepted Submission(s): 8080 Problem Description A numb

【转】HDU 1058 Humble Numbers:寻找丑数问题?DP?

这个和上一道HDU 3199 Hamming Problem是类似的,有了思路就开始码代码了,可是!序数词的写法不对(代码注释部分)又上网普及了序数词的写法··· 搜到其他解题报告 其中有把这道题分类为DP的,最优子结构?无后效性? 还有“寻找丑数问题” 详情点这里. #include<iostream> #include<cstdio> using namespace std; const int Size=5842; long long num[Size+1]; int mai

HDU 1058 Humble Numbers (动规+寻找丑数问题)

Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16742    Accepted Submission(s): 7280 Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble numb

HDU 1058 Humble Numbers(递推)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 题意:丑数是指只有2,3,5 or 7这几个素因数的数(所以1也是丑数),找到第n个丑数. 思路:除了2,3,5,7任何一个丑数都是由另一个丑数乘上2,或3,或5,或7得到的. 所以可以用优先队列,每取出一个丑数就入队他们乘上2,3,5,7得到的四个丑数,这样每个丑数都生成了.复杂度还是不错的,不过按这种方法会生成比较大的数,最终爆掉int,所以要用long long //93MS 1228K

HDU 1058 Humble Numbers (DP)

Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18238    Accepted Submission(s): 7934 Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble numbe

hdu 1058 Humble Numbers【dp】

题目链接:http://acm.acmcoder.com/showproblem.php?pid=1058 题意:数字只有2,3,5,7素因子的数叫做Humble Number,问你第 n 个Humble Number是什么? 解法:枚举. 代码: #include <stdio.h> #include <string.h> #include <vector> #include <string> #include <algorithm> #inc