Ugly Numbers

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiyaozhe/article/details/81081535

Ugly Numbers

题目链接:Ugly Numbers

题目概述:丑数就是因子仅能是2,3,5的数,另外规定1也是丑数。丑数“1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15…”。求第1500的丑数。

Input:

没有输入

Output:

The 1500'th ugly number is <number>.

解题思路:
一、从2开始循环依次判断当前数是否是丑数(能被连续被2,3,5整除),然后用count统计1500次,输出该数即可。

二、想办法从上一个丑数推断出下一个丑数,而不需要从1开始遍历再判断。从1开始的10个丑数分别为1,2,3,4,5,6,8,9,10,12。可以发现除了1以外,丑数都是由某个丑数*2或者*3或者*5得到的。如2是丑数1*2得到的,3是丑数1*3得到的,4是丑数1*4得到的,5是丑数1*5得到的,6是丑数2*3得到的……

具体算法步骤:

(1)从第一个丑数1开始,求出1*2=2 ,1*3=3 ,1*5 = 5;

(2)取上面乘积中大于1的最小值2,作为第二个丑数(丑数是个递增序列,所以第i+1个丑数一定比第i个丑数)

(3)求丑数2之前的丑数与2、3、5的乘积:1*2=2 ,1*3=3 ,1*5 = 5; 2*2 = 4; 2*3 = 6; 2*5 =10;

(4)取上面乘积中大于2的最小值3,作为第三个丑数
……

……

(i)取出丑数i之前的丑数分别与2、3、5的乘积

(i+1)取乘积中大于i的最小值作为丑数

(i+2)重复(i)(i+1)的步骤直到计数器等于N


最终代码:

#include <iostream>
#include <vector>

using namespace std;
int nthUglyNumber(int n);

int main(){
    int result = nthUglyNumber(1500);
    cout << "The 1500'th ugly number is "<<result<<"."<< endl;
}
int nthUglyNumber(int n) {
        int a = 0, b = 0, c = 0;
        vector<int> ans(n, 1);
        for (int i = 1; i < n; i++) {
            int cur = min(ans[a] * 2, min(ans[b] * 3, ans[c] * 5));
            if (ans[a] * 2 == cur) a++;
            if (ans[b] * 3 == cur) b++;
            if (ans[c] * 5 == cur) c++;
            ans[i] = cur;
        }
        return ans[n - 1];
}

猜你喜欢

转载自blog.csdn.net/xiyaozhe/article/details/81081535
今日推荐