zoukankan      html  css  js  c++  java
  • 埃式筛法筛素数(计祘客找质数)

    做法:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。

    例如 计祘客 找质数题目链接:https://nanti.jisuanke.com/t/A2238

    一天蒜头君猜想,是不是所有的偶数(除了 22),都可以用两个质数相加得到呢?于是聪明的蒜头君就找你来验证了。

    输入格式

    第一行输入一个整数 tt 表示测试组数。

    接下来 tt 行,每行一个整数 nn。

    输出格式

    输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。

    数据范围

    对于 30\%30% 的数据 1 le t le 10^31t103。

    对于 60\%60% 的数据 1 le t le 10^51t105。

    对于 100\%100% 的数据 1 le t le 10^6, 4 le n le 10^61t106,4n106,nn 为偶数。

    样例输入

    3
    4
    8
    20

    样例输出

    2 2
    3 5
    3 17

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e6+10;
    bool vis[N];
    int main()
    {
    	int i;
    	memset(vis,true,sizeof(vis));
    	for(i = 2; i <= N; i++){
    		if(vis[i]){
    			for(int j = i+i; j <= N; j += i){
    				vis[j] = false;
    			}
    		}
    	}
    	int n;
    	scanf("%d",&n);
    	while(n--){
    		int x;
    		scanf("%d",&x);
    		for(i = 2; i <= x/2; i++){
    			if(vis[i] == true && vis[x-i] == true){
    				printf("%d %d
    ",i,x-i);
    				break;
    			}
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    阿里规范
    阿里规范
    阿里规范
    sql 优化步骤
    事务的并发问题:脏读、幻读和不可重复读
    Hive 常见面试题(二)
    yield 的使用
    Java 线程状态
    Lambda 表达式推演全过程
    IDEA 代码自动补全/自动联想 功能
  • 原文地址:https://www.cnblogs.com/clb123/p/10567140.html
Copyright © 2011-2022 走看看