icodelab 最多的约数
Posted mysh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了icodelab 最多的约数相关的知识,希望对你有一定的参考价值。
描述
对于一个正整数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 最多的约数的主要内容,如果未能解决你的问题,请参考以下文章