求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.你的解释看了,最后还是不懂呢 “时间复杂度Nlog(N)” ,有没有其他的思路了?

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/02 14:27:00
求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.你的解释看了,最后还是不懂呢 “时间复杂度Nlog(N)” ,有没有其他的思路了?
xW_OV*T(+! ^`Ӧ=LaӞN&Ē㸉BH.mJB; l iI!:).|s$ &%^sνǓʴY]j&FG)7M;`#Y%s8ΓJd*dJ2u8"ą?qg4`f:(G˜YZ:ۢfz۫Ea/Pc*g26 gQÀ=:M= D-@Y&'o1XafƙSG)IaۨPҍ7+@T-@ŐcԋV< ]㗍H!`.,QHڜ$5Tx :4QV' /"QD/{ m-)+1!F &[~d"1e_*ڬ$FnS1⊐@߰/,{F 0 =&UKL-poыKI4^@zUm1QRgkn5lm*oUa2ͭE>C$?Aq|.yW%Ws6z U2ŧs>2"/=J(t?(,b(.1-%V5>V<^c+3 nM_86 S8eqɪ^=}JΒ)hɨ/4vDu:Bv#(-$Eס--pGFD/,)\9|K1L+6btv'?쇩XZߑL\3 6@]l?0loV͊U)ov5Os[~ݴ >Wڭvy9y*?4x(bG8X7K`ԏq70)!-u\.Yun5ʎ95+YBdp J疒W ȺB)}Ml9d.Hk岻eAhi=F2

求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.你的解释看了,最后还是不懂呢 “时间复杂度Nlog(N)” ,有没有其他的思路了?
求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.
你的解释看了,最后还是不懂呢 “时间复杂度Nlog(N)” ,有没有其他的思路了?

求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.你的解释看了,最后还是不懂呢 “时间复杂度Nlog(N)” ,有没有其他的思路了?
第一个数是1,然后扩展出了{2,3,5}
每次挑最小的乘以2,3,5,扩展出三个数


每次选出最小的数,最小堆就能解决.
就是一个取堆顶,把扩展后的数放入堆中的过程.


每次插堆的复杂度是 log(N),一共有3*N个数,所以就是 N*log(N)


你看看堆是什么东西




一个小代码,你可以看看
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

class cmp{
public:
    bool operator()(const long long& a,const long long& b) {
         return a > b;
    }
};

priority_queue<long long,vector<long long>,cmp> minHeap;

/*
上面的代码: priority_queue是一个优先队列,每次取最小的一个数.
C++ STL 自己实现的,可以看看什么是优先队列,什么是堆.
每次往优先队列插入一个数或者删除一个数的复杂度是 log(N) 
*/ 

int main() {
    int n;
    while ( scanf("%d", &n) != EOF) { //找第n个满足要求的数 
        minHeap.push(1); //第一个数是 1 
        for (int i = 1; i < n; ++i) { 
            long long minValue = minHeap.top(); //得到当前最小的数 
            while (minHeap.top() == minValue) { //把重复的都删掉 
                minHeap.pop();
            }
            minHeap.push(minValue*2); //用最小的数乘以2,3,5进行扩展 
            minHeap.push(minValue*3);
            minHeap.push(minValue*5);
        }
    
        long long ans = minHeap.top(); //第n次的最小的数就是答案了.因为1500可能超过int的最大数值了,所以用long long 
         
        printf("the %dth num is %lld\n", n, ans);
        while (!minHeap.empty()) {
            minHeap.pop();
        }
    }
    
    return 0;
}

求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0 C编程:求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0如题 求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0 求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.只求编程的思路. 求第1500个只有2,3,5因子的数 数是从小到大排列 第一个数是1,1=2^0*3^0*5^0.希望给的是原创 求第1500个只有2,3,5因子的数.数是从小到大排列,第一个数是1,1=2^0*3^0*5^0.你的解释看了,最后还是不懂呢 “时间复杂度Nlog(N)” ,有没有其他的思路了? free pascal的题目一个数如果只有因子2、3、5或7,那么这样的数就叫做神奇数.数据序列1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,25,27,是前20个神奇数.写程序求出数据序列的第n个神奇数输入:一个整数n 数2450的因子数怎么求?有多少? 一个耗尽天才脑力的数学问题求具有100个因子的最小整数是多少?(包括1和这个数本身)例如:24有1,2,3,4,6,8,12,24共8个因子. 《急》已知24有8个正整数因子1,2,3,4,6,8,12,24已知24有8个正整数因子1,2,3,4,6,8,12,2424正好被其因子8整除,求[300,1000]之间能被其因子数目整除的数的总和. 分解因式pascal一个自然数N的正因子个数记为F(N),例如18的所有正因子为1、2、3、6、9、18,所以F(18)=6.现在给出K,求所有满足F(N)=K的N中最小的数.要求pascal语言完成.Input 第一行n,表示有n个数据,1我 pascal 输入判断H数 【问题描述】 所谓H 数是指:仅包含质因子2,3,5,7的数.例如:2,3,4,5,6,7,8,9,10 均为H数但 11 不是H数,12是H数,13不是H数,.给出一个N (10≤n≤10000),求出由小到大的第N 个H 数.例 24有8个正整数因子 24刚好被8整除.求1000到1500之间这样的数 急求用C#编写一个程序:求2-100中的完数(因子之和等于它本身的数称为完数,如6=1+2+3). 急求用C#编写一个程序:求2-100中的完数(因子之和等于它本身的数称为完数,如6=1+2+3). 35的数因子是什么? 若某整数N的所有因子之和等于N的倍数,则N称为多因子完备数,如数28,其因子之和1+2+4+7+14+28=56=2*28,28是多因子完备数.求[1,200]之间有多少个多因子完备数用C语言编写;最后答案为4请用C语言编写 因子分解是指将一个整数分解为若干个素数的积的过程如20的素数因子有2、2、5(1不是素数因子).要求:输入一个整数(int),请按升序输出该数的所有素数因子以及因子之和. C++编程实现 求一个正整数数的全部素数因子输出格式 例如 :126=2*3*3*7