求质数算法之试除法

来源:互联网 发布:域名转让流程 编辑:程序博客网 时间: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语言版)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 油电混合没电了怎么办 前向运动精子3%怎么办 精子活力正常精子活率低怎么办? 精子形态正常率低怎么办 前向运动精子20%怎么办 不运动精子率高怎么办 前向运动精子少怎么办 精子前向运动力低怎么办 精子异常形态率高怎么办 精子正常率才1%怎么办 精子头部缺陷率高怎么办 前向运动精子15%怎么办 精子向前运动力低怎么办 前向运动精子10%怎么办 前向运动精子12%怎么办 前向运动精子2%怎么办 正常精子形态只有10%怎么办 精子混合畸形率高怎么办 正常形态精子才2怎么办 精子密度低至0.8怎么办 精子总活动率低怎么办 前向运动精子低怎么办 精子畸形率百分之94怎么办 实验室授权签字人考不过怎么办 万和热水器排污口漏水怎么办 万和热水器水箱漏水怎么办 军训鞋大了怎么办妙招 麽稍神经不好受怎么办 绒面高跟鞋太硬怎么办 新买的鞋子太硬怎么办 鞋底太硬脚掌疼怎么办 耐克鞋子走路吱吱响怎么办 两只鞋子有色差怎么办 劳保鞋鞋底太硬怎么办 在学校校服丢了怎么办 高中没进重点班怎么办 孩子不懂学不想学怎么办 孩子小学数学学不懂怎么办 入学籍系统提交了没分班怎么办 被监考老师抓了作弊怎么办 作弊被老师抓到了怎么办?