求质数算法之试除法
来源:互联网 发布:域名转让流程 编辑:程序博客网 时间:2024/06/05 06:16
需求:求得一定范围内的素数。
方法:
试除法:
1.顾名思义,就是不断地尝试能否整除。比如要判断自然数 x 是否质数,就不断尝试小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是质数。
但是根据上述写出来的固然可以得到素数,但是花费时间过多。以下是越来越简化的思路:
思路1.
德巴赫猜想,一个偶数可以分解为两个素数之和,其中一个必然小于或等于这个偶数的一半。
所以不断尝试小于 x/2 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是质数。
思路2:
除了2以外,所有可能的质因数都是奇数。所以,他们就先尝试 2,然后再尝试从 3 开始一直到 x/2 的所有奇数。
思路3:
因数都是成对出现的。比如,100的因数有:1和100,2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。
所以只要从 2 一直尝试到√x,就可以了。
思路4:
若是要求101以内的素数,就是从2尝试到10,这之间有3和9,不能被3整除,肯定不能被9整除。
所以只要尝试从2到√x之间的素数就可以,而这些数前面已经算出来了。
#include<stdio.h>#include<math.h>#define max 1000int arr[max]={2,3,5};int f(int n){ int j,m=3,i=2,q; while(1) { m+=2;////2是素数,偶数都是非素数,奇数加2仍为奇数 q=sqrt(m); for(j=1;arr[j]<=q;j++) { if(m%arr[j]==0) break; } if(q<arr[j]) { arr[i++]=m; } if(fabs(m-n)<=1) break; } for(j=0;j<i;j++) printf("%d\n",arr[j]);}int main(){ int n; scanf("%d",&n); f(n); return 0;}
还有一种筛选法也常常用于求素数:Eratosthenes筛选法(C语言版)
阅读全文
0 0
- 求质数算法之试除法
- 试除法求质数的最快方法!
- 求质数算法的N种境界 - 试除法和初级筛法
- 求质数算法的N种境界[1] - 试除法和初级筛法
- Java求质数算法
- 1.求质数 算法
- 求质数算法C++
- 求质数的算法
- 求素数(质数)的算法
- 简单的求质数算法
- 求质数的筛选算法
- 求质数(素数)算法思想
- 求质数(素数)算法思想
- 求素数(质数)算法
- 【质数算法】——判断质数、求小于N的质数、求前N个质数
- for循环之求质数
- 汇编算法之除法
- [算法]求质数的算法之Miller-Rabin算法,C语言实现
- dubbo源码解析(三): Socket Server和方法调用
- PHP 伪静态规则写法RewriteRule-htaccess详细语法使用
- hadoop MapReduce 输出结果中文乱码解决
- 【loj】#6004. 「网络流 24 题」圆桌聚餐(二分图匹配)
- JAVASE jar文件的打开---Win7
- 求质数算法之试除法
- 从小菜鸟到老菜鸟
- android 6.0 7.0 不一样的处理权限适配
- Java+Selenium3框架设计准备篇10-用非PageFactory实现POM
- SoapUI、Jmeter、Postman三种接口测试工具的比较分析——灰蓝
- sql 报错:语句被终止。完成执行语句前已用完最大递归 100。
- 源码阅读--腾讯Tinker热修复框架
- 在Activity中调用Service的方法——本地服务
- hibernate主配置文件的数据库属性所在的