丑数

题目: 
一个数的因子仅仅包括2,3,5的数称为丑数。数字1特别对待也看作是丑数,所以从1開始的10个丑数分别为1,2。3。4,5,6,8,9。10。12。

1.判断一个数是否是丑数

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int N,flag=0; 
	cin>>N;
	int temp =N; 
	while(N)
	{
		while(N%2==0) N/=2;
	 	while(N%3==0) N/=3;
	 	while(N%5==0) N/=5;
	 	if(N==1)
	 	{
	 		flag=1;
	 		break;
	    }
	    else 
		{
		  flag=0;
		  break;
	    }
	}
	if(flag==1)cout<<temp<<"是丑数"<<endl;
	if(flag==0)cout<<temp<<"不是丑数"<<endl; 
} 

2.输入N,输出第N个丑数

#include<bits/stdc++.h>
using namespace std;
int uglyNum(int num)
{
    int flag=0;
	while(num)
	{
		while(num%2==0) num/=2;
	 	while(num%3==0) num/=3;
	 	while(num%5==0) num/=5;
	 	if(num==1)
	 	{
	 		flag=1;
	 		break;
	    }
	    else 
		{
		  flag=0;
		  break;
	    }
	}
	if(flag==1)return 1;
	if(flag==0)return 0;
}
int main()
{
	int N,cou=0,M=1; 
	cin>>N;
	while(M)
	{
		if(uglyNum(M))
		{
			cou++;	
		}
		if(cou==N)
		{
			cout<<M<<endl;
			break;
		}
		else
		{
			M++;
		}					
	}		
} 

3.输入N,输出第N个丑数(优化)

优化分析:丑数都是前面已有丑数乘以2、3或5生成的。假设已有丑数已按增序排列,那么下一个丑数一定是已有丑数分别乘以2、3、5得到的数中大于当前最大丑数中的最小的一个。

#include<bits/stdc++.h>
using namespace std;
//分析:元素依次输出并保存在vector的动态数组中。 
int GetUglyNumber_Seq(int index) {
    vector<int> ugly(index, -1);
    if (index <= 0) return 0;
    int idx2 = 0, idx3 = 0, idx5 = 0, i = 1;
    ugly[0] = 1;
    while (i<index)
    {
        int new2 = ugly[idx2] * 2;
        int new3 = ugly[idx3] * 3;
        int new5 = ugly[idx5] * 5;
        int tempVal = min(min(new2, new3), new5);
        if (tempVal == new2)
            idx2++;
        if (tempVal == new3)
            idx3++;
        if (tempVal == new5)
            idx5++;
        ugly[i] = tempVal;
        i++;
    }
    return ugly[index - 1];
}
int main()
{
    int n = 0;
    cin >> n;
    int ret = GetUglyNumber_Seq(n);
    printf("%d\n", ret);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值