题目:
我们把只包含因子2,3和5的数称作为丑数。求按从小到大的顺序的第1500个丑数。例如6,8都是丑数,但是14不是,因为它包含因子7。习惯上我们把1作为第一个丑数。
丑数的判断:
遍历法:
1、如果一个数能够被2整除,那么让他继续除以2;
2、如果一个数能够被3整除,那么让他继续除以3;
3、如果一个数能够被5整除,那么让他继续除以5;
4、如果最后这个数变为1,那么这个数就是丑数,否则不是。
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int sum=0;
int main(void)
{
int i=1;
int temp;
clock_t t1,t2;
t1=clock();
while(sum<1500)
{
temp=i;
while(temp%2==0)
{
temp=temp/2;
}
while(temp%3==0)
{
temp=temp/3;
}
while(temp%5==0)
{
temp=temp/5;
}
if(temp==1)
{
sum++;
printf("%d %d\n",sum,i);
}
i++;
}
t2=clock();
printf("The 1500th ugly number is %d.\n",i-1);
printf("The time is %ds.\n",(t2-t1)/1000);
system("pause");
return 0;
}
空间换时间(追赶法)
将前面的丑数乘以2,3,5,取较小的积作为下一个丑数,并记录被2,3,5所乘当前丑数的索引,并增加产生当前丑数因子所对应的索引,重复以上步骤
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int sum=0;
int min(int a,int b,int c)
{
int temp;
if(a<b)
{
temp=a;
}
else
{
temp=b;
}
if(c<temp)
{
temp=c;
}
return temp;
}
int main(void)
{
int temp,temp1,temp2,temp3;
clock_t t1,t2;
int s[1500];
int iA=0,iB=0,iC=0;
t1=clock();
s[sum]=1;
while(sum<1499)
{
temp1=2*s[iA];
temp2=3*s[iB];
temp3=5*s[iC];
temp=min(temp1,temp2,temp3);
s[++sum]=temp;
if(temp==temp1)
{
iA++;
}
if(temp==temp2)
{
iB++;
}
if(temp==temp3)
{
iC++;
}
}
t2=clock();
printf("The 1500th ugly number is %d.\n",s[1499]);
printf("The time is %dms.\n",t2-t1);
system("pause");
return 0;
}