1 条题解

  • 1
    @ 2025-5-25 17:19:01

    这段代码实现了生成“丑数”(仅包含质因数2、3、5、7的数)的算法,核心是通过优先队列思想高效生成有序丑数序列。

    算法原理

    丑数定义:丑数是只能被2、3、5、7整除的正整数,1是特殊的丑数。
    生成策略
    维护4个指针p2,p3,p5,p7,分别指向当前已生成丑数中乘以2、3、5、7后能得到最小新丑数的位置。
    每次取4个候选值(a[p2]*2, a[p3]*3, a[p5]*5, a[p7]*7)中的最小值作为下一个丑数,并将对应指针后移(避免重复生成)。
    3. 数据结构:用数组a存储生成的丑数,按顺序递增排列。

    关键步骤

    初始化:数组首元素为1,4个指针均指向1。
    迭代生成:循环计算4个候选值的最小值,加入数组并更新对应指针,直到超过最大值限制(1e18)。
    查询输出:根据输入直接返回数组中对应位置的丑数。

    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    const LL maxn=1e18;
    LL allmin(LL a,LL b,LL c,LL d){
    	return min(min(a,b),min(c,d));
    }
    LL a[70005],top=0;
    int main()
    {
    
    	LL p2,p3,p5,p7,q=1;
    	a[++top]=1;
    	p2=p3=p5=p7=1;
    	while(q<maxn&&q>0){
    		q=allmin(a[p2]*2,a[p3]*3,a[p5]*5,a[p7]*7);
    		a[++top]=q;
    		if(q==a[p2]*2) p2++;
    		if(q==a[p3]*3) p3++;  
    		if(q==a[p5]*5) p5++;
    		if(q==a[p7]*7) p7++;
    	}
    	
    	LL ca,i;
    	cin>>ca;
    	while(ca--){
    		scanf("%lld",&i);
    		printf("%lld\n",a[i]);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2308
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者