码迷,mamicode.com
首页 > 其他好文 > 详细

icodelab 最多的约数

时间:2019-08-06 00:58:27      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:oid   void   namespace   为什么   long   str   space   思路   include   

描述

对于一个正整数a,如果所有小于a的数的约数个数都小于a本身的约数个数,我认为这个数正是我们所要的。

输入

输入一个正整数X。

输出

输出一个不大于X的且满足上述要求的最大的数a。

输入样例 1

1000

输出样例 1

840

提示

对于10%的数据,1<=n<=1,000 。对于40%的数据,1<=n<=1,000,000。对于100%的数据,1<=n<=2,000,000,000。

代码(为什么没写思路呢?借用老师的代码,注释详细):

#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
int prime[12] = { 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
// 2*3*5*7*11*13*17*19*23*29>n,所以只需考虑到29即可
ll n, BestSum, BestNum;
//当前走到num这个数,接着用第k个素数,num的约数个数为sum,
//第k个素数的个数上限为limit
void solve(ll num, ll sum, ll limit, ll k) {
    if (sum > BestSum) {//找到了约数更多的数,自然保存约数更多的数 
        BestSum = sum;//保存个数 
        BestNum = num;//保存数字本身 
    } else if (sum == BestSum && num < BestNum) {  //约数个数一样时,取小数
        BestNum = num;
    }
    for (int i = 1; i <= limit; i++) {  //素数k取i个
        num *= prime[k];
        if (num > n)//num已经超过n了,显然不需要再找下去了 
            return;
        //第2个参数 sum*(1+i) 表示当前num的约数个数,参考质数分解定理 
        //第3个是参数是i,表示后面的数字的幂不可能超过前面数字的幂
        solve(num, sum * (1 + i), i, k + 1); 
    }
}
int main() {    
    cin >> n;
    //solve(num, sum, limit, k) 
    //当前走到num这个数,num的约数个数为sum,接着用第k个素数,第k个素数的个数上限为limit    
    solve(1, 1, 30, 1);
    cout << BestNum;
    return 0;
} 

 

icodelab 最多的约数

标签:oid   void   namespace   为什么   long   str   space   思路   include   

原文地址:https://www.cnblogs.com/mysh/p/11306325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!