• 丑数


    题目描述

    把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
     
    思路1:只能被2,3,5整除的就是丑数。
    int GetUglyNumber_Solution(int index) {
    
        if (index <= 0)return -1;
    
        if (index == 1){
            return 1;
        }
        int num = 2;
        int tmp = 0;
        index -= 1;
        while (index){
            tmp = num;
            while (tmp % 2 == 0){
                tmp /= 2;
            }
            while (tmp % 3 == 0){
                tmp /= 3;
            }
            while (tmp % 5 == 0){
                tmp /= 5;
            }
            if (tmp == 1){
                index--;
                num++;
            }
            else if (tmp>5){
                num++;
            }
        }
        return num-1;
    }
    View Code

    思路2:动态规划

    //所有丑数都是另一个丑数乘以2,或者乘以3,或者乘以5
    //第一个丑数是1,那么我们可以创建一个系列,丑数1*2,1*3,1*5也是丑数
    //将1*2,1*3,1*5放入容器vector中,自动按照从小到大排序,
    //vector[1]就是第2个最小丑数记做min=2
    // min=2, 再将min*2,1*3,1*5,,min=3
    // min=3, 2*2,1*3,1*5,min=4
    丑数是在之前的某一个丑数的基础上的最小丑数,因此只要记录当前的丑数,是在某一个丑数的基础上,乘以因子2,因子3,因子5。求得最小,就是下一个丑数。
    int GetUglyNumber_Solution(int index) {
        if (index <= 0) return 0;
        if (index == 1) return 1;
        vector<int>k(index); k[0] = 1;
        int t2 = 0, t3 = 0, t5 = 0;
        for (int i = 1; i<index; i++) {
            k[i] = min(k[t2] * 2, min(k[t3] * 3, k[t5] * 5));
            if (k[i] == k[t2] * 2) t2++;
            if (k[i] == k[t3] * 3) t3++;
            if (k[i] == k[t5] * 5) t5++;
        }
        return k[index - 1];
    }
    View Code
  • 相关阅读:
    证明三个简单数学问题~(≧▽≦)/~啦啦啦
    计算时间复杂度
    字符三角形(循环做法)
    luogu Peter的烟
    c++一本通1000
    luogu最长连号
    luogu子数整数
    luogu三角函数
    (因更改文件夹造成)anaconda prompt 提示系统找不到指定的路径
    echarts之树形图改变节点之间连线颜色以及结点的颜色
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/5937702.html
Copyright © 2020-2023  润新知