判断素数

筛选素数

喜欢而已 提交于 2020-03-25 14:49:35
//发现了一种写起来方便的素数筛选法、速度也够快 //比用sqrt写函数判断快噢 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define N 1000000 using namespace std; bool hash[N]; int main() { int i,j=0; for(j=4;j<N;j+=2) hash[j]=1; for(i=3;i<1000;i+=2) if(!hash[i])//在这里面就可以直接收集素数放在数组里面了 for(j=i*i;j<N;j+=i) hash[j]=1; for(j=1,i=3;i<N;i+=2) if(!hash[i]) j++; printf("%d\n",j); return 0; } 来源: https://www.cnblogs.com/372465774y/archive/2012/07/23/2604835.html

PHP筛选法求素数

心已入冬 提交于 2020-03-25 12:03:06
首先,素数是只能被自己和1整除的正整数,特别指出的是我们规定1不是素数。 分析: 首先判断一个数是不是素数: 我们这样做的,用选定的这个数除以小于当前这个数的平方根的所有的数,如果有一个能整除,则不是素数,否则素数。这里的关键是为何只用是平方根就行呢? 是这样的,不难发现,当一个数等于两个数的乘积时,那么这两个数中必然有一个要小于这个数的平方根,另外一个数肯定大于这个数的平方根,也就说当我们发现当前数能被比他平 方根小的数整除,就不用去整除另一个比他平方根大的数,减少循环次数,让算法更简洁。 方法一:普通方法 代码实现: <?php function sushu($n) { for($j=2;$j<=$n;++$j){ for($i=2,$sqrt=sqrt($j);$i<=$sqrt;++$i){ //只用判定当前数的平方根 if($j%$i==0){ continue 2; //如果不是素数,则跳出内层循环,从外层循环继续执行 } } echo $j; echo "<br>"; } } sushu(100); //100以内的素数 ?> 方法二:利用筛选法求素数 分析:何为筛选法呢?是这样的,首先我们把1标识成素数,把0标识成非素数,假设给出的N个数都是素数,标识为1 从第一个数开始筛选,遇到当前这个数的倍数就把他的倍数标识改为0,标识完后再进入第二个数重复第一个数的操作

素数筛选法

99封情书 提交于 2020-03-25 12:02:15
素数筛选法 素数(又称质数):指在大于一的自然数中,只能被1和它自身整除的自然数; 素数筛选法是指一种非常规的素数判定方法,比较高效率; 原理:任何数的整数倍必定不是素数,大于二的偶数必定不是素数。 我们以找出100以内的素数为例,利用原理,我们可以首先排除偶数是素数,然后进一步判断奇数 实现将偶数标记为0,素数标记为1;(也可以用一个bool数组将偶数标记为false,奇数标记为true) 下面是全部代码 #include <iostream> #include <cmath> #define MAX 100 using namespace std; int main() { //设置标记,将偶数标记为0 int prime[MAX+1]; for(int i=1;i<=MAX;i++) { if(i%2==0) { prime[i]=0; } else prime[i]=1; } for(int i=3;i<=sqrt(MAX);i++) { if(prime[i]==1) { for(int j=i+i;j<=MAX;j=j+i) { prime[j]=0; } } } cout<<"2"<<" "; for(int i=3;i<=MAX;i++) { if(prime[i]==1) cout<<i<<" "; } return 0; } 来源: https://www

暑假第三周

不打扰是莪最后的温柔 提交于 2020-03-18 07:03:47
这周还是继续学习了机器学习的第5 7 8章,主要是弄清了正规方程算法,logisitic回归,算法的优化,和过拟合的处理。 这是学习过程中的笔记。 在学习过程找中遇到的主要问题是正规方程算法和logisitic算法的学习时的理解。 另外还敲了一些代码,具体如下: 一:首先是java基本语法的学习,自己练手时敲了一点代码: package first; import java.util.*; import java.io.*; public class first{ public static void main(String[] args) throws IOException{ Scanner cin = new Scanner(System. in ); int a ; int b=1; for (a=0;b==1;a++){ System. out .println("请输入一个整数:"); int c; c= cin.nextInt(); if (c<0) System. out .println("该数字小于零!"); else if (c%2==0) System. out .println("该数字为偶数!"); else System. out .println("该数字为奇数!"); System. out .println("是否继续判断?是请输入1,否请输入0

问问算法后面的为什么

[亡魂溺海] 提交于 2020-03-09 08:15:31
题目:写一个函数,判断一个数是否是素数 素数是指除了能被1和它本身整数外,不能被其他任何整数整除的数 我们常用的方法就是 :假设输入为k,判断k是否能够被2到根号k之间的数整除,如果能够,则说明不是素数,反之,则是素数 那为什么要 根据 k是否能够被2到根号k之间的数整除 来做判断,这背后的道理逻辑在哪里? 这是我接触C语言的第四年,前面三年我一直都没有弄清楚过,最近的一点感悟就是 多问问自己为什么 比如说 36 是素数 开方等于6 而 36=3 12 36=4 9 36=6*6 36如果写成两个数相乘的形式,一定有一个是<=根号36,有一个是>=根号36,所以只要判断从2-根号36就好了,根号36之后的数一直到36-1,都是对前面乘法的重复 此外,反证法: 设k=a b; 如果存在 a,b>根号k, 则a b>根号k*根号k=k,与已知矛盾, 所以 如果k有除了1和本身以外的其他因子,那一定也在1到根号k里面存在 C代码: # include <stdio.h> # include <math.h> int sushu ( int n ) ; void main ( ) { int n ; scanf ( "%d" , & n ) ; sushu ( n ) ; } int sushu ( int n ) { int i ; for ( i = 2 ; i <= sqrt ( n

[pat乙]1007 素数对猜想

♀尐吖头ヾ 提交于 2020-03-06 01:23:43
1007 素数对猜想 (20 分) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 思路: 1.刚开始我写的时候是n^2循环并放入数组之后考虑,后来编译器出了问题,且一直是部分正确,于是我借鉴了一下其他博客的。 2.搜索对象从i——sqrt(n)——n/i降低时间复杂,加入bool函数拆分循环并取消string数组判断的步骤。 3.因为是素数对,所以判断对象直接由3到n-2。 4.因为素数不可能是偶数,所以直接n+=2. 5.只要过程中bool判断是一次素数,就直接交给下面判断对。 # include <iostream> # include <math.h> using namespace std ; bool isPrime ( int n ) { for ( int i = 3 ; i <= n / i ; i ++ ) if ( ! ( n % i ) ) return false ; return

素数查找指定范围的素数

和自甴很熟 提交于 2020-03-03 16:52:50
首先素数的概念:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除 1不是素数,只能被1和自身整除的数才是素数(也叫质数) 理论上,1能被1整除.也能被自身1整除,但在数学领域里.规定1不是素数。 实现步骤 为了能够每次运行时都可以定义查找素数的范围,所以用键盘录入 通过键盘录入录入一个查找范围,并且循环这个范围的每一个数字 每循环一个数字,对这个数字进行取余操作(只要取余结果==0则不是素数) 这个时候就与要定义一个boolean类型的变量,这个变量的初始值设为true(下面说原因) 取余操作,因为要对当前数字下除了1和本身外所有数字进行取余操作,所以再使用一个循环进行取余(取余结果等于零说明这个数不是素数,这个时候返回一个false,反之变量值不变) 取余这个循环完成后判断boolean变量==true,等于true说明是素数,打印输出 public static void main ( String [ ] args ) { // 键盘录入 Scanner sc = new Scanner ( System . in ) ; System . out . println ( "请输入一个开始的数字" ) ; int i = sc . nextInt ( ) ; System . out . println ( "请输入一个结束的数字" ) ; int j =

1013 数素数 (20 分)

雨燕双飞 提交于 2020-03-01 22:12:07
题目 令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 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 代码 // 1013 数素数 (20 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include<cmath> using namespace std; //判断是否是质数 bool is_prime(int number) { if (number == 1) { return false; } if (number == 2) { return true; } for (int i = 2; i <= sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } int main(){ //输入 int number_1, number_2; cin >

12 质数

蓝咒 提交于 2020-03-01 08:49:15
题目:判断101-200之间有多少个素数,并输出所有素数。 a = [ ] for i in range ( 101 , 201 ) : for j in range ( 2 , i ) : if i % j == 0 : break else : #一定要注意和谁对齐! a . append ( i ) print ( i , end = ' ' ) print ( ) print ( len ( a ) ) 运行结果: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 21 来源: CSDN 作者: `k 链接: https://blog.csdn.net/qq_46399291/article/details/104575128

Python 入门练习实例五

筅森魡賤 提交于 2020-03-01 03:06:31
目录 Python 练习实例: Python 练习实例: 题目: 判断2-100之间有多少个素数,并输出所有素数。 程序分析: 质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他 因数 的自然数 判断素数的方法:用一个数分别去除2到这个数,如果能被整除,则表明此数不是素数,反之是素数。 来源: CSDN 作者: Thinklov 链接: https://blog.csdn.net/u010244992/article/details/104579114