判断素数

ZJNU 1223 - 素数距离——高级

妖精的绣舞 提交于 2020-01-26 01:11:37
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≈46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除阶段,可以用 l=((L+prnum[i]-1)/prnum[i])*prnum[i] 计算出区间内的第一个是prnum[i]的倍数的数 注意,如果计算出来的使其本身,取倍数 再用 r=R/prnum[i]*prnum[i] 计算出最后一个是prnum[i]的倍数的数 符合条件时,从l到r,每次加prnum[i],标记出所有以prnum[i]为因子的数 因为无法直接开数组标记到大数 但又因为R-L≤1000000 所以可以对位置进行转换 标记时取-L+1,取出时取-1+L 最后将区间内的素数取出放在ans这个vector集合内,对答案进行判断即可 (注意特殊情况的判断) 1 /* 2 Written By StelaYuri 3 */ 4 #include<bits/stdc++.h> 5 using namespace std; 6 typedef long long ll; 7 vector<ll> prnum,ans; 8 bool prim[46400],ar[1000010];

素数问题

安稳与你 提交于 2020-01-25 01:25:46
如何判断一个数是否为素数 暴力方法 判断一个数n是否为素数,只需在(1,n)看是否存在它的因子 bool IsPrime(int n) { if(n < 2) return false; else if(n == 2) return true; else{ for(int i = 2;i < n;++i) if(n % i == 0) return false; return true; } } 优化版1 定理 :如果n是合数,在 \((1,\sqrt{n}]\) 必定存在它的因子 证明:设 \(n=ab\) 假设a,b都小于 \(\sqrt{n}\) ,那么 \(ab<\sqrt{n}\sqrt{n}=n\) ,矛盾 假设a,b都大于 \(\sqrt{n}\) ,那么 \(ab>\sqrt{n}\sqrt{n}=n\) ,矛盾 因此我们可以得知,只需在 \((1,\sqrt{n}]\) 中看是否存在它的因子即可,再者可先判断n是否为偶数(2除外),不是偶数的话,只需在 \((1,\sqrt{n}]\) 中的奇数看是否存在它的因子即可 bool IsPrime(int n) { if(n < 2) return false; else if(n == 2) return true; else if(!(n&1))//n是偶数 return false; else { int num

ZZULIOJ 1092: 素数表(函数专题)

浪尽此生 提交于 2020-01-24 16:33:09
题目描述 输入两个正整数m和n,输出m和n之间的所有素数。 要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。 int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 } 对于C/C++代码的提交,本题要求必须通过定义prime函数和main函数实现,否则,提交编译错误,要提交完整的程序。 输入 输入两个正整数m和n,m<=n,且都在int范围内。 输出 输出占一行。输出m和n之间的所有素数,每个数后有一个空格。测试数据保证m到n之间一定有素数。 样例输入 2 6 样例输出 2 3 5 tips: 1 判断一个数是不是素数,可以从2-n-1,也可以从2-根号n 判断 2 本题从2-n-1判断超时,使用2-根号n #include<stdio.h> #include<stdlib.h> #include<math.h> int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 int i; if ( n==1) //先判断n是否为1,1不是素数 { return 0; } for (i = 2; i <= (int)sqrt(n); i++) //sqrt()返回double,需要强转 ,是否需要=可以带入数,如4

L1-028 判断素数 (10分) 的坑

戏子无情 提交于 2020-01-24 09:41:11
L1-028 判断素数 (10分) 的坑 关于素数判断的卡时间问题 题目链接: L1-028 判断素数 (10分) 题目 本题的目标很简单,就是判断一个给定的正整数是否素数。 输入 输入在第一行给出一个正整数 N (≤ 10),随后 N 行,每行给出一个小于2^​31的需要判断的正整数。 输出 对每个需要判断的正整数,如果它是素数,则在一行中输出 Yes ,否则输出 No 。 样例输入 2 11 111 样例输出 Yes No 解题思路 2^31 对应的十进制数是 2147483648 ,是一个十位数,按照正常的思路就是写一个函数,遍历 2到根号n 中间的所有数,如果其中有一个数可以把n整除,那么说明n不是素数。 bool is_prime(int n) { for (int i = 2; i < sqrt(n); i++) if (n % i == 0) return false; return true; } 而取根号比较比较麻烦,又要声明一个 <cmath> 函数库,sqrt()函数的值又不整,有时会让人有点难受。(当然我就随便说说,如果你不以为然请不要喷我> _ <) 所以出现了下面这种写法 bool is_prime(int n) { for (int i = 2; i*i < n; i++) if (n % i == 0) return false; return

PAT-乙级-1013.数素数

♀尐吖头ヾ 提交于 2020-01-23 20:39:12
题目 令Pi表示第i个素数。现任给两个正整数M <= N <= 10^4,请输出PM到PN的所有素数。 输入格式: 输入在⼀行中给出M和N,其间以空格分隔。 输出格式: 输出从PM到PN的所有素数,每10个数字占1⾏行行,其间以空格分隔,但⾏行行末不不得有多余空格。 输⼊样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 解法 #include <iostream> #include <vector> #include <cmath> using namespace std ; int judge ( int n ) //判断是否是素数 { for ( int i = 2 ; i <= sqrt ( n ) ; i ++ ) if ( n % i == 0 ) return 0 ; return 1 ; } int main ( ) { int m , n ; //输入范围 int count = 0 ; //计数器 int num = 0 ; //换行控制器 vector < int > v ; //设置动态数组 cin > > m > > n ; for ( int i = 2 ; count <= n ; i ++ ) //添加素数至动态数组中 { if (

PAT-乙级-1007.素数对猜想

最后都变了- 提交于 2020-01-23 16:38:35
题目 让我们定义 dn 为:dn = pn+1 – pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数 对猜想”认为“存在⽆无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 105),请计算不不超过N的满⾜足猜想的素数对的个数。 输入格式: 每个测试输⼊入包含1个测试⽤用例例,给出正整数N。 输出格式: 每个测试⽤用例例的输出占⼀一⾏行行,不不超过N的满⾜足猜想的素数对的个数。 输入样例: 20 输出样例: 4 解法 核心就是一个素数的判断 # include <iostream> # include <vector> # include <cmath> using namespace std ; int judge ( int n ) //判断是否是素数 { int flag = 0 ; for ( int i = 2 ; i <= sqrt ( n ) ; i ++ ) { if ( n % i == 0 ) { flag = 1 ; break ; } } if ( flag == 1 ) return 0 ; else return 1 ; } int main ( ) { vector < int > v ; int n ; cin >> n ; int count = 0 ; //求出范围内的素数 for ( int i =

美素数//HDU - 4548//数论

天大地大妈咪最大 提交于 2020-01-22 15:29:28
美素数//HDU - 4548//数论 题目 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。   问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。   给定一个区间,你能计算出这个区间内有多少个美素数吗? Input 第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。 接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。 Output 对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。 每组数据占一行,具体输出格式参见样例。 Sample Input 3 1 100 2 2 3 19 Sample Output Case #1: 14 Case #2: 1 Case #3: 4 链接:https://vjudge.net/contest/351853#problem/G 思路 先筛出素数再筛出题目需要的数 代码 # include <cstdio> # include <cstring> # include <iostream> # include <string> # include <algorithm> # include

LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)

久未见 提交于 2020-01-22 07:55:25
这是悦乐书的第 311 次更新,第 332 篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762)。给定两个正整数L和R,在[L,R]范围内,计算每个整数的二进制数中1的个数,判断1的个数是否是一个素数。例如,21的二进制数是10101,其中1的个数有3个,3是一个素数。例如: 输入:L = 6,R = 10 输出:4 说明: 6 --> 110(2个1,2是素数) 7 --> 111(3个1,3是素数) 9 --> 1001(2个1,2是素数) 10 --> 1010(2个1,2是素数) 输入:L = 10,R = 15 输出:5 说明: 10 --> 1010(2个1,2是素数) 11 --> 1011(3个1,3是素数) 12 --> 1100(2个1,2是素数) 13 --> 1101(3个1,3是素数) 14 --> 1110(3个1,3是素数) 15 --> 1111(4个1,4不是素数) 注意 : L,R是[1,10 ^ 6]范围内的整数,并且L小于等于R. R减L的差最多为10000。 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。 02 第一种解法 第一步,需要先计算出整数的二进制数中1的个数

素数筛选法

核能气质少年 提交于 2020-01-22 00:06:09
如何求出小于 N 的所有质数? 筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数 在筛选的过程中,我们可以给每个数字赋值一个指标,1. 在判断过程中,把要筛掉的数字指标改为 0 ,这样循环一遍之后留下来指标仍旧为1的,就是合格的数字 # include <iostream> using namespace std ; void isPrime ( bool prime [ ] , int n ) { for ( int i = 2 ; i < n ; i ++ ) //先初始化为true prime [ i ] = true ; for ( int i = 2 ; i * i < n ; ++ i ) { for ( int j = i + 1 ; j < n ; ++ j ) { if ( j % i == 0 ) //筛选掉能被 i 整除的数 prime [ j ] = false ; } } for ( int i = 2 ; i < n ; ++ i )

素数打表,埃式筛法

心已入冬 提交于 2020-01-20 20:20:17
我们在求解问题的时候会经常碰到素数(问题),以下对素数求解问题比较 素数:素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 1:根据定义我们能够写出以下代码判断素数 思路:枚举2到n-1判断他们能否被整除,不能即是素数 int prime ( int n ) { for ( int i = 2 ; i < n ; i ++ ) if ( n % i == 0 ) return 0 ; return 1 ; } 题目描述 :求出1-N中的所有素数 输入 大于1的正整数N 输出 1-N中的所有素数,(以从小到大的格式输出) 样例输入9 样例输出2 3 5 7 # include <iostream> using namespace std ; int prime ( int n ) { for ( int i = 2 ; i < n ; i ++ ) if ( n % i == 0 ) return 0 ; return 1 ; } int main ( ) { int n ; cin >> n ; for ( int i = 2 ; i <= n ; i ++ ) { if ( prime ( i ) ) cout << i << " " ; } return 0 ; } 2:对1进行优化 思路:枚举2到sqrt(n)能否被整除,不能即是素数。 int