原题链接:最多约数问题
代码已通过,难度就是如何解决时间超限的问题!可参考以下代码,如果想仔细研究,可参考这篇博客 (博客地址)
参考代码:
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复