何海涛:《剑指Offer:名企面试官精讲典型编程题》:九度OJ
题目描述:http://ac.jobdu.com/problem.php?cid=1039&pid=17
把只包含因子2、3和5的数称作丑数(Ugly Number)。3
代码已AC:
思想:本质就是2 ,3 ,5 的乘积的组合,不过要顺序组合,那么我们的操作就是:每次都将2,3,5乘以一个已经是丑数的数,再比较大小,小的进入数组,然后在比较;
例如:1是丑数,那么下一个比较 2 * 1、3 * 1和5*1,那么得到的是2,2进入数组,下面比较的是2*2、3*1 和5*1( 注意因为后面的3*1和5*1的大小并不确定,所以还要继续进行比较 )得到3进入数组,再比较 2 * 2、3 * 2和5*1.。。。。。 基本算法就是:2 * c2 、3*c3 、5 * c5,ci 是数组的下标,每次都选择后都ci++一个。。。直到N个丑数。。
#include <stdio.h> #include <math.h> long long int min( long long int n1, long long int n2, long long int n3 ) { long long int t = n1 < n2 ? n1 : n2; return t < n3 ? t : n3; } int main() { long long int ug[1500]; int c2 = 0, c3 = 0, c5 = 0, N; ug[0] = 1; N = 1; while( N < 1500 ) { ug[N] = min( ug[c2] * 2, ug[c3] * 3, ug[c5] * 5 ); if( ug[N] == ug[c2] * 2 ) // 因为可能数相等,所以不能else if { c2++; } if( ug[N] == ug[c3] * 3 ) { c3++; } if( ug[N++] == ug[c5] * 5 ) { c5++; } } while( scanf("%d", &N) != EOF ) { printf("%lld\n", ug[N-1]); } return 0; }