ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

各种筛法

2022-06-10 23:31:15  阅读:166  来源: 互联网

标签:各种 scanner 筛法 min int nextInt new Scanner


一、质数筛法

1.Eratosthenes筛法:

从\(2\)开始,由大到小扫描每个数\(x\),将其的倍数\(2x,3x,...[N/x]*x\)标记为合数。当扫描到一个数时,若它未被标记,则它不能被\([2,x-1]\)之间的任何数整除,该数为质数。
复杂度\(O(NloglogN)\)。

点击查看代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author dongyudeng
 */
public class Eratosthenes {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(), q = scanner.nextInt();
        boolean[] visited = new boolean[n + 1];
        List<Integer> list = new ArrayList<>();
        for (int i = 2; i <= n; i++) {
            if (visited[i]) continue;
            list.add(i);
            for (int j = i; j <= n / i; j++) visited[i * j] = true;
        }
        while ((q--) > 0) {
            int k = scanner.nextInt();
            System.out.println(list.get(k - 1));
        }
    }
}

2.线性筛法:

考虑在上述筛法中重复标记的情况,比如\(12\),它既会被\(2\)标记又会被\(3\)标记,我们要使得标记\(12\)的方式唯一。
我们令\(min_i\)表示\(i\)的最小质因子,并通过以下方法维护\(min\):
1.依次考虑\([2,N]\)之间的每一个数\(i\)。
2.若\(min_i=i\),说明\(i\)为质数,将其保留。
3.扫描不大于\(min_i\)的每个质数\(p\),令\(min_{i*p}=p\)。
由于每个合数\(i*p\)只会被\(p\)筛一次,时间复杂度为\(O(N)\)。

点击查看代码
import java.util.Scanner;

/**
 * @author dongyudeng
 */
public class LinearSieve {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(), q = scanner.nextInt(), m = 0;
        int[] min = new int[n + 1], primes = new int[n + 1];
        for (int i = 2; i <= n; i++) {
            if (min[i] == 0) {
                min[i] = i;
                primes[++m] = i;
            }
            for (int prime : primes) {
                if (prime > min[i] || prime > n / i) break;
                min[i * prime] = prime;
            }
        }
        while ((q--) > 0) {
            int k = scanner.nextInt();
            System.out.println(primes[k]);
        }
    }
}

标签:各种,scanner,筛法,min,int,nextInt,new,Scanner
来源: https://www.cnblogs.com/nofind/p/16364971.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有