首页 > 代码库 > hdu1058 Humble Numbers(丑数)
hdu1058 Humble Numbers(丑数)
丑数:只包含一定的质因子的数称丑数,例如包含2,3,5.我们就把2,3,4,5,6,8,9,10,12,15.......。但我们通常把1称作为第一个丑数。
解题思路:我们现在做的这道题,就是以2,3,5,7为质因子,要我们求第n个丑数(以1为第一个丑数),可以采用DP的思想来解决。我们先以array[1]=1为基础,在它乘以质因子取得最小的数为有序数组的第二个,然后依次类推。写出状态转移方程:array[n] = Min(array[n2]*2, array[n3]*3, array[n5]*5, array[n7]*7);这就是这道题的解题思路吧。
贴上代码:
#include <stdio.h>int Min(int num1, int num2, int num3, int num4) //求出4个数中的最小的一个{ int min1, min2; min1 = num1 > num2 ? num2 : num1; min2 = num3 > num4 ? num4 : num3; return (min1 > min2 ? min2 : min1);}void Ugly(int array[]) //将各个丑数求出按照顺序{ array[1] = 1; int mark; int n, n2 = 1, n3 = 1, n5 = 1, n7 = 1; for(n = 2; n<=5842; n++) { mark = Min(array[n2]*2, array[n3]*3, array[n5]*5, array[n7]*7); //状态转移方程 array[n] = mark; if(mark%2 == 0) //若是质因子的倍数,则加1 n2++; if(mark%3 == 0) n3++; if(mark%5 == 0) n5++; if(mark%7 == 0) n7++; }}void Output(int array[], int n) //输出格式的控制{ if(n%10 ==1 && n%100 != 11) printf("The %dst humble number is %d.\n", n, array[n]); else if(n%10 ==2 && n%100 != 12) printf("The %dnd humble number is %d.\n", n, array[n]); else if(n%10 == 3 && n%100 != 13) printf("The %drd humble number is %d.\n", n, array[n]); else printf("The %dth humble number is %d.\n", n, array[n]);}int main(){ int n; int array[6000]; Ugly(array); while(scanf("%d", &n) != EOF && n != 0) { Output(array, n); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。