丑数的判断与计算

题目:

我们把只包含因子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;
}



你可能感兴趣的:(丑数计算,丑数判断)