其他分享
首页 > 其他分享> > 因数最多的数(DFS,质因数分解,剪枝)

因数最多的数(DFS,质因数分解,剪枝)

作者:互联网

蒜头君对一个数的因数个数产生了兴趣,他想知道在 1 到 n 的范围内,因数个数最多的数是多少。如果有多个这样的数,他想知道最小的那个。
输入格式
第一行一个整数 T,表示数据的组数。

接下来 T 行,每行一个正整数 n。

1≤T≤100,1≤n≤10e16

输出格式
一共输出 T 行,每行一个正整数表示最多因数个数的数。

样例输入

3
10
100
1000

样例输出

6
60
840

思路:
在这里插入图片描述
代码:

#include<bits/stdc++.h>
using namespace std;
long long t,n,Max=-0x3fffffff,ans=-0x3fffffff;//Max记录目前最大的因子的个数,ans记录因子个数最多的数的最小的那个
int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};//2*3*5*...*47已经大于10e16了
void dfs(int ind,int m,long long num,long long cnt){//当前枚举到了第几个质数,当前质数最多选多少个,当前的数,当前数的因数个数
    if(cnt>Max){//如果当前值的因数个数比Max大更新,Max和ans
        Max=cnt;
        ans=num;
    }else if(cnt==Max&&num<ans){//如果因子数相同但该数更小,更新ans
        ans=num;
    }
    
    if(ind==15) return;//如果15个质数都枚举完了就退出
    for(int i=1;i<=m;i++){//对该质数的个数进行枚举
        num=num*prime[ind];//不断乘以该质数
        if(num>n) return;//如果该值大于n则退出
        dfs(ind+1,i,num,cnt*(i+1));//枚举下一个质数,这里第2个参数是i,是第i个因子次数>=第i+1个因子次数,减少搜索量。 
    }
    
}
int main(){
    cin>>t;
    while(t--){
        Max=-0x3fffffff,ans=-0x3fffffff;
        cin>>n;
        dfs(0,60,1,1);//从第0个质数开始考虑,初始的质数的次数不超过60(2最多选60个),初始的数为1,初始的数的因数个数为1.
        cout<<ans<<endl;
        
    }
}

标签:剪枝,因数分解,Max,质数,DFS,因数,num,long,ans
来源: https://blog.csdn.net/weixin_43833610/article/details/115792537