代码已通过,难度就是如何解决时间超限的问题!可参考以下代码,如果想仔细研究,可参考这篇博客 (博客地址)
参考代码:
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 人评分
简单的a+b (C语言代码)浏览:528 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:644 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:566 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:793 |
图形输出 (C语言代码)浏览:1422 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:569 |
C二级辅导-计负均正 (C语言代码)浏览:523 |
Tom数 (C语言代码)浏览:598 |
敲七 (C++代码)浏览:1119 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:653 |