1 条题解

  • 0
    @ 2025-12-6 13:57:38

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    //首先实现一个求最小值的函数,在后面会用得到
    int GetMin(int a,int b,int c)
    {
        if(a <= b && a <= c)
            return a;
        else if(b <= c && b <= a)
            return b;
        else
            return c;
    }
    int GetUglyNumber_Solution(int index ) 
    {
        int arr[index];
        if(index < 7)//小于7的丑数直接返回自身就可以
            return index;
        else//这是大于7时的方案
        {
            arr[0] = 1;//首先把数组第一个元素初始化为1,作为万物之伊始
            int temp2 = 0,temp3 = 0,temp5 = 0,j = 0,p2,p3,p5;
            /*temp2、temp3、temp5代表了三个乘积的指针,p2、p3和p5则记录了
            当前其对应的指针指向的值与自身倍数的乘积。j用来判断是否到达了要
            求丑数的范围。*/
            while(j < index)
            {
                if(arr[temp2]*2 > arr[j])
                    p2 = arr[temp2]*2;
                    /*如果当前的乘积大于最右端丑数,指针无需移动,只需记录下
                    这个乘积*/
                else
                    p2 = arr[++temp2]*2;
                    //这个与上一语句的差别仅在于是否移动指针
                //下面均同理
                if(arr[temp3]*3 > arr[j])
                    p3 = arr[temp3]*3;
                else
                    p3 = arr[++temp3]*3;
                if(arr[temp5]*5 > arr[j])
                    p5 = arr[temp5] * 5;
                else
                    p5 = arr[++temp5] * 5;
                arr[++j] = GetMin(p2,p3,p5);
                /*最后比较一下三个乘积的最小值,别忘了要++j把他加在当前数组
                末尾的下一位*/
            }
        }
        return arr[index-1];
    }
    int main()
    {
        int k = 0;
        scanf("%d", &k);
        printf("%d", GetUglyNumber_Solution(k));
    }
    
    
    • 1

    信息

    ID
    3155
    时间
    1000ms
    内存
    16MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者