剑指offer 34- 丑数

来源:互联网 发布:linux常用命令手册pdf 编辑:程序博客网 时间:2024/05/18 21:05

只包含因子2/3/5的数称为丑数。

方法1:逐个判断每个整数是不是丑数

方法2:创建数组保存已经找到的丑数,用空间换时间的方法

每一个丑数都是前面的丑数乘以2、3、5得到的

                已有丑数中最大丑数为M,下一个丑数应该是已知丑数分别乘以2、3、5的第一个大于M的数,记录,每个乘以2、3、5第一个大于M的位置更新。

#include<iostream>using namespace std;bool IsUgly(int num){while(num%2==0)num = num/2;while(num%3==0)num = num/3;while(num%5==0)num = num/5;return (num==1)?true:false;}int GetUglyNumber1(int N){if(N<=0)return 0;int uglyNum=0;int num=0;while(uglyNum<N){num++;if(IsUgly(num))uglyNum++;}return num;}int Min(int num1,int num2 ,int num3){int min = num1<num2? num1:num2;min = min<num3?min:num3;return min;}int GetUglyNumber2(int N){if(N<=0)return 0;int *uglyNumbers = new int[N+1];uglyNumbers[0]=1;int index = 0;int *uglyNum2=uglyNumbers;int *uglyNum3=uglyNumbers;int *uglyNum5=uglyNumbers;while(index<N){int min = Min(*uglyNum2*2,*uglyNum3*3,*uglyNum5*5);uglyNumbers[++index] = min;while(*uglyNum2*2<=uglyNumbers[index])uglyNum2++;while(*uglyNum3*3<=uglyNumbers[index])uglyNum3++;while(*uglyNum5*5<=uglyNumbers[index])uglyNum5++;}int result = uglyNumbers[index-1];delete []uglyNumbers;return result;}void Test(char* testName,int N,int expected){cout<<testName<<endl;cout<<"Solution1:\t";if(expected == GetUglyNumber1(N))cout<<"Passed"<<endl;else cout<<"Failed"<<endl;cout<<"Solution2:\t";if(expected == GetUglyNumber2(N))cout<<"Passed"<<endl;else cout<<"Failed"<<endl;cout<<endl;}void Test1(){int N = 4;Test("test1",N,4);}void Test2(){int N = 7;Test("test2",N,8);}void Test3(){int N = 1;Test("test3",N,1);}void Test4(){int N = 0;Test("test4",N,0);}int main(){Test1();Test2();Test3();Test4();}


0 0
原创粉丝点击