判断素数

素数

不想你离开。 提交于 2019-12-03 07:12:15
一、定义   素数又称质数,是指一个大于 \(1\) 的正整数,如果除了 \(1\) 和它本身外,没有其他任何约数。偶素数只有一个为 \(2\) 。   对于正实数 \(x\) ,定义 \(\pi(x)\) 为不大于 \(x\) 的素数个数,那么 \(\pi(x)\approx\frac{x}{ln(x)}\) 二、素数的判定   对于单个数或数据范围比较小时,我们采用枚举法: bool is_prime(int x) { for(int i=2;i<=sqrt(x);i++) if(!(x%i))return 0; return 1; }   对于比较大的数据范围,并且要求出范围内的所有质数,我们卡可以采用筛选法   1、 \(Eratosthenes\) 筛选法 void get_prime(int N) { memset(v,0,sizeof(v)); for(int i=2;i<=N;i++) { if(v[i])continue ; prime[++cnt]=i; for(int j=i;j<=N/i;j++)v[i*j]=1; } }   不过我们发现这个筛法的效率并不高,因为它会重复筛选同一个质数。因此,就有了第二种筛法——快速线性筛法,它的复杂度几乎是线性的。 void get_prime(int N) { memset(v,0,sizeof(v)); for

Miller-Rabin素数测试

匿名 (未验证) 提交于 2019-12-03 00:41:02
给出一个小于1e18的数,问它是否为质数?不超过50组询问。 hihocoder 我是真的菜,为了不误导他人,本篇仅供个人使用。 首先,一个1e18的数,朴素 \(O(\sqrt{n})\) 素数判定肯定爆炸。怎么办呢? 我们知道,对于素数p,只要a不是p的倍数,一定有 \(a^{p-1}=1\mod p\) 。那么,我们是不是可以选出某些a,对于要判定的数p,看看他是否满足以a为底的费马小定理,以此来判定质数呢?答案是基本可以。 但是很不巧,有一类合数,以任何小于它们的质数为底进行判定,结果都是正确的。它们叫做伪素数。怎么排除伪素数的情况呢?有个叫做二次探测定理的东西:若 \(x^2=1\mod p\) ,那么 \(或x=1或-1\mod p\) 。 假设 \(a^{x-1}=1\mod p\) 成立。如果x-1为奇数,就不再判定下去。否则,根据二次探测定理,还可以继续去判定 \(或a^{\frac{x-1}{2}}=1或-1\mod p\) 是否成立。如果它不等于1或-1,就返回false。如果它等于-1,就返回true。如果它等于1,就继续判定下去。反正,只要x-1为偶数,并且 \(a^{x-1}=1\mod p\) ,就可以一直判定。这样就可以把那些伪素数排除掉了。这就叫做miller-rabin素数测试。据说选前7个质数作为a,在1e18内也只有两三个会被miller

素数环

匿名 (未验证) 提交于 2019-12-03 00:40:02
问题 E: 素数环 [ 提交 ][ ״̬ ][ 讨论版 ][命题人: quanxing ] 题目描述 素数环:从1到n这n个数摆成一个环,要求相邻的两个数的和是一个素数。如,n=8是,素数环为: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 总数为4 输入 输出 样例输入 8 样例输出 4 解题思路:回溯搜索,开一个num数组用于保存素数环中的数,一个mk[i]数组用于标记数值为i的数是否已经在素数环中,然后dfs一下即可 #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,sum=0; int num[16],mk[16]; int j=2; bool is_Ok(int x,int y)//判断相邻俩个数的和是否为素数 { int sum=x+y; int j=sqrt(sum); for(int i=2;i<=j;++i) { if(sum%i==0)return false; } return true; } void dfs(int x) { if(x>n) { if(is_Ok(num[1],num[n]))sum++;//如果每一个数都已经存入素数环中

习题5-4 使用函数求素数和(20 分)

匿名 (未验证) 提交于 2019-12-03 00:39:02
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。 素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。 函数接口定义: int prime( int p ); int PrimeSum( int m, int n ); 其中函数 prime 当用户传入参数 p 为素数时返回1,否则返回0;函数 PrimeSum 返回区间[ m , n ]内所有素数的和。题目保证用户传入的参数 m ≤ n 。 裁判测试程序样例: #include <stdio.h> #include <math.h> int prime( int p ); int PrimeSum( int m, int n ); int main() { int m, n, p; scanf("%d %d", &m, &n); printf("Sum of ( "); for( p=m; p<=n; p++ ) { if( prime(p) != 0 ) printf("%d ", p); } printf(") = %d\n", PrimeSum(m, n)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例: -1 10 输出样例: Sum of ( 2 3 5 7 ) = 17 #include <stdio.h> #include <math.h> int

使用两个嵌套的for循坏探测2-100的所有素数

匿名 (未验证) 提交于 2019-12-03 00:34:01
只能被1和本身整除的整数才叫做素数 public class prime { public static void main(String[] args) { for ( int i = 2 ; i <= 100 ; i++ ) { int factors = 0 ; // 定义一个变量,等会计数用。 for ( int j = 1 ; j<=i; j++ ) { if ((i % j) == 0 ) factors++; // 能被整除的,进行计数,+1; } if (factors <= 2 ) // 这里factors<=2的就是素数,因为,一个素数只能被本身和1整除。所以被整除的次数<=2的话,那么就可以判断这个数就是素数。 // 在此处,其实可以把<=改成==,原因和前面一样(一个素数只能被本身和1整除),也就是说,一个素数,只能被计数两次; System. out .println(i + " is prime " ); } } } 代码中的注解已经很详细了,仔细看,慢慢揣摩,是可以看懂的。 实在看不懂的可以留言。 原文:https://www.cnblogs.com/xm970829/p/9219055.html

实训日报2

匿名 (未验证) 提交于 2019-12-03 00:32:02
今日学习任务:C语言的基础训练 1 .如何判断闰年? 2. 如何判断一个素数?100~200之间的素数怎么判断? 3.求两个数的最大公约数,最小公倍数? 4. 设计一个计算器程序 5. 设计一个日历程序,输入年月日,输出当年第多少天? 6.把一个三位数整数,逆序输出 7. 求1~100之间的和 8. 200~300之间不能被3整除的数,5个一行输出 今日任务完成情况:按照作业要求,完成约200行代码。 今日开发中出现的问题汇总:不懂问百度,实在不行就谷歌。 今日未解决问题:无。 今日开发收获:复习了C语言的知识,对自己的动手能力有所提升。 实现一种功能可以有许多方法,要扩展思维 自我评价:一般,不太满意。 其他:无 文章来源: 实训日报2

判断素数方法总结

匿名 (未验证) 提交于 2019-12-03 00:25:02
time命令输出的信息 [1] real : 表示程序整个的运行耗时。可以理解为foo运行开始时刻你看了一下手表,程序运行结束时,你又看了一下手表,两次时间的差值就是本次real 代表的值 [2]user :这个时间代表的是foo运行在用户态的cpu时间,什么意思? 首先,我来讲一下用户态和核心态: 核心态(Kernel Mode): 在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下都是为那些最底层的,由操作系统提供的,可信可靠的代码来运行的。内核态的代码崩溃将是灾难性的,它会影响到整个系统。 用户态(User Mode): 在用户态,代码不具备直接访问硬件或者访问内存的能力,而必须借助操作系统提供的可靠的、底层的API来访问硬件或者内存。由于这种隔离带来的保护作用,用户态的代码崩溃(Crash),系统是可以恢复的。我们大多数的代码都是运行在用户态的。 为什么要区分Kernel Mode 和 User Mode呢?答案是隔离保护,使得系统更稳定。 好,讲完用户态和核心态之后,我们来看user time。我们已经说过了,这个指的是程序foo运行在用户态的cpu时间,cpu时间不是墙上的钟走过的时间,而是指CPU工作时间。 sys : 这个时间代表的是foo运行在核心态的cpu时间 1.根据素数的定义

#习题5-4 使用函数求素数和

匿名 (未验证) 提交于 2019-12-03 00:22:01
习题5-4 使用函数求素数和(20 分) 本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。 素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。 函数接口定义: int prime( int p ); int PrimeSum( int m, int n ); 其中函数 prime 当用户传入参数 p 为素数时返回1,否则返回0;函数 PrimeSum 返回区间[ m , n ]内所有素数的和。题目保证用户传入的参数 m ≤ n 。 裁判测试程序样例: #include <stdio.h> #include <math.h> int prime( int p ); int PrimeSum( int m, int n ); int main() { int m, n, p; scanf("%d %d", &m, &n); printf("Sum of ( "); for( p=m; p<=n; p++ ) { if( prime(p) != 0 ) printf("%d ", p); } printf(") = %d\n", PrimeSum(m, n)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例: -1 10 输出样例: Sum of ( 2 3 5 7 ) = 17 #include <stdio.h>

nyoj26-孪生素数问题

匿名 (未验证) 提交于 2019-12-03 00:21:02
孪生素数问题 时间限制: 3000 65535 KB 难度: 3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。 输入 第一行给出N(0<N<100)表示测试数据组数。 接下来组测试数据给出m,表示找出m之前的所有孪生素数。 (0<m<1000000) 输出 每组测试数据输出占一行,该行为m范围内所有孪生素数组数。 样例输入 1 14 样例输出 4 #include <iostream> #include <cstring> #include <cmath> using namespace std; int a[1000000]; void isPrime(int number) { int i,j; for(i=1;i<=number;i++) if(i%2) a[i]=1; for(i=3;i<=sqrt(number);i+=2) if(a[i]) { for(j=i*2;j<=number;j+=i) a[j]=0; } } int main() { int n,m,i,count; cin>>n; while(n--) { cin>>m; memset(a,0,sizeof(a

L1-028 判断素数(10 分)

匿名 (未验证) 提交于 2019-12-03 00:18:01
L1-028 判断素数(10 分) 本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数N(<=10),随后N行,每行给出一个小于2^31^的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出“Yes”,否则输出“No”。 输入样例: 2 11 111 输出样例: Yes No #include<stdio.h> #include<math.h> int prime( int n) { int i,t; t= sqrt (n); if (n== 1 ) return 0 ; else for (i= 2 ;i<t;i++) if (n%i== 0 ) return 0 ; return 1 ; } int main() { int n,t; scanf ( "%d" ,&n); while (n--){ scanf ( "%d" ,&t); if (prime(t)== 1 ) printf ( "Yes\n" ); else printf ( "No\n" ); } return 0 ; } 文章来源: L1-028 判断素数(10 分)