* 题目: * 小蓝很喜欢科研,他最近做了一个实验得到了一批实验数据,—共是两百万个正整数。 * 如果按照预期,所有的实验数据工都应该满足 1e7<= x <=1e8。 * 但是做实验都会有一些误差,会导致出现一些预期外 的数据,这种误差数据y的范围是1e3≤ y ≤1e12。由于小蓝做实验很可靠,所以他所有的实验数据中 * 99.99%以上都是符合预期的。 * 小蓝的所有实验数据都在primes.txt 中,现在他想统计这两百万个正整数中有多少个是质数,你能告诉他吗? * <p> * 思路: * 1:99.99%以上都是符合预期的。说明有误差的数非常少 我们可以使用check函数特别判断这些单个大的数 check函数的复杂度在1e6 误差的数最大为 1e12 根号1e12=1e6 * 2:我们使用2个筛法 1e8的数我们使用筛子 超过1e8我们用check函数 * */ public class 小蓝做实验 { static int N = 100000010; static final int n = (int) 1e8; static boolean[] st = new boolean[N]; // static List<Integer> list = new ArrayList<>(); public static void main(String[] args) throws IOException { // io流读取文件 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\itheima\\Java\\SuanFa\\SuanFa\\src\\main\\java\\LqJava\\_课程代练\\第二章\\test5\\xiaolanzuoshiyan.txt"))); // 预处理 init(); // 用来统计答案 long ans = 0; while (true) { // 读取一整行数据 String s = br.readLine(); // 说明没有数据了 if (s == null) break; // 一定要开long 1e12 把字符串转换为long类型 long v = Long.parseLong(s); // n 就是一个条件 大于这个条件和小于这个条件就用2个不同的判断素数的方法去判断 if (v > n) { if (check(v)) ans++; } else if (!st[(int) v]) { // false为素数 true为合数 ans++; } } System.out.println(ans); System.out.println(342693); } // 预处理 埃式筛 1e8可以接受 // O(n) 1e12 static void init() { // 从下标2开始存 0和1都特判掉不是素数 可以直接不管 从第三个数开始 for (int i = 2; i <= n; i++) { if (st[i]) continue; // list.add(i); // 将i的倍数全部标记为true也就是合数 for (int j = i + i; j <= n; j += i) { st[j] = true; } } } // 判断单个数是否是质数 0(根号n) 1e6 根号1e12=1e6 // check函数都运行不了几次 因为大的数特别少 static boolean check(long v) { for (int i = 2; i <= v; i++) { if (v % i == 0) return false; } return true; } }
蓝桥杯 java 小蓝做实验
最新推荐文章于 2024-08-02 13:28:07 发布