原题链接:最多约数问题
代码已通过,难度就是如何解决时间超限的问题!可参考以下代码,如果想仔细研究,可参考这篇博客 (博客地址)
参考代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int lift;
int right;
lift = cin.nextInt();
right = cin.nextInt();
MaxDiv maxDiv = new MaxDiv();
MaxDiv.primes();
if (lift == 1 && right == 1) {
MaxDiv.max_num = 1;
MaxDiv.numb = 1;
} else {
MaxDiv.max_num = 2;
MaxDiv.numb = 1;
MaxDiv.search(1, 1, 1, lift, right);
}
System.out.println(MaxDiv.max_num);
/*System.out.println(MaxDiv.numb);*/
}
}
class MaxDiv {
public static int max_num; // 存最多的质因子个数
public static int numb; // 存质因子最多的数
public final static int MAXP = 31622; // 普通数组最大的大小
public final static int PCOUNT = 3401; // 素数数组最大的大小
public static int prime[] = new int[PCOUNT + 1]; // 素数数组
// 欧拉筛法求素数表
public static void primes() {
int k = 0;
boolean num[] = new boolean[MAXP + 1];
for (int i = 2; i <= MAXP; i++) {
num[i] = true;
}
for (int i = 2; i <= MAXP; i++) {
if (num[i]) {
prime[++k] = i;
}
for (int j = 1; j <= k && prime[j] * i <= MAXP; j++) {
num[prime[j] * i] = false;
}
}
}
// 这个函数没明白, 照抄书上的
public static void search(int from, int tot, int num, int low, int up) {
if (num >= 1)
if ((tot > max_num) || ((tot == max_num) && (num < numb))) {
max_num = tot;
numb = num;
}
if (low == up && low > num)
search(from, tot * 2, num * low, 1, 1);
for (int i = from; i <= PCOUNT; i++) {
if (prime[i] > up)
return;
else {
int j = prime[i];
int x = low - 1;
int y = up;
int n = num, t = tot, m = 1;
// 应该是循环除质因子
while (true) {
m++;
t += tot;
x /= j;
y /= j;
if (x == y)
break;
n *= j;
search(i + 1, t, n, x + 1, y);
}
m = 1 << m;
if (tot < max_num / m)
return;
}
}
}
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复