判断素数的几种方法思考

【】判断素数是经常遇到的问题,下面就总结几种方法

1、最简单的从2~sqrt(N)的方法(N>=2,下同)

2、筛选法

3、素数判断法

概念说明:

素数,又叫质数,指除了1和它本身外,没有其他因数。(如果你不知道什么叫因数,建议你去从小学2年级开始学习-_-!);

合数:自然就是除了1和它本身外有其他因数。

需指出一点,1既不是质数也不是合数。

因此,判断N是素数的简单而笨的方法就是看看N有没有因数。

1、最简单的方法:

该算法的思想就是用2~sqrt(N),依次去对N求余,只要有一个余数是0,则N是合数。举例如下:

>>CODE

/*-------------isPrimer.c-------------

*----------Date : 09-25-2005---------

*----------All Rights Shared---------

*----------test in C-Free3.5---------

*-----------------------------------*/

#include

#include

#include

void main(int argc, char* argv[])

{

int N, i, m,flag = 0;

if(argc < 2)

{

while(1)

{

printf("Please input a non-integer:");

if(scanf("%d", &N) != 1)

{

fflush(stdin);

continue;

}

break;

}

}

else

N = atoi(argv[1]);

m =(int) sqrt(N*1.0);

for(i = 2;i <= m; i++)

if(N % i ==0)

{

flag = 1;

break;

}

if(flag)

printf("%d is not a primer\n", N);

else

printf("%d is a primer\n", N);

system("pause");

}

注:以上代码判断不出1、2、3来。

上面的代码就是按照这个简单的思路来的,思路是简单了,但是方法效率是不高的。因为我们知道,一个数如果不能被2整除,那么也就不能被4、6、等所有的偶数整除。但是我们的程序在判断了2之后依然会去判断4、6等。所以我们可以把循环规则改变成先判断2,如果不能被2整除就从3开始判断所有的奇数。即:

>>CODE

if(N % 2 != 0)

{

for( i = 3; i <= m; i +=2)

//……此处省略了

}

else

// 合数

2、筛选法判断素数。

这个方法不是用来判断一个素数,而是所有素数的方法。方法的原理是:

QUOTE:http://www.math.utah.edu/classes/216/assignment-07.html

The goal of this assignment is to design a program which will produce lists of prime numbers. The method is based on the one discovered by Erastosthenes (276 - 196 BC). His method goes l ...

这段E文没什么难理解的,就是首先生成数组,然后从第一个开始依次标注它的倍数,然后从下一个没有被标注的开始,标注它所有的倍数,这样依次下去,最后没有被标注的都是素数。下面是代码:

>>CODE

/*----------------------------------------

*--------------筛选法--------------------

*---------------------------------------*/

#include

#include

void main(int argc, char* argv[])

{

int N, i, *m, j = 0,temp;

if(argc < 2)

{

while(1)

{

printf("Please input a non-integer:");

if(scanf("%d", &N) != 1)

{

fflush(stdin);

continue;

} /* end if*/

break;

} /*end while*/

} /* end if*/

else

N = atoi(argv[1]);

m = (int*)malloc(sizeof(int) * (N - 1));

// inital the arry

for(i = 0; i < N -1; i++)

*(m+i) = i+2;

while(1)

{

// find the start number-index

for(; j < N - 2;j++)

if(*(m+j) != 0){temp = *(m+j);break;}

if(j < N - 2)

{

for(i = j+1; i < N - 1; i++)

if(*(m+i) % temp == 0)

*(m+i) = 0;

} /* end if*/

else break;

j++;

} /* end while*/

printf("The primer is:");

for(i = 0; i < N-1; i++)

if(*(m+i) != 0)printf("%d,", *(m+i));

printf("\n");

free(m);

system("pause");

} /* end main */

当然这样占用的空间是相当大的。另外,其实可以省略所有的偶数。

3、素数判断法【简单方法】

考虑到这么一个现实:任何一个合数都可以表现为适当个素数的乘积的形式,所以我们只用素数去除要判断的数即可,比如要判断100以内的素数,只用2,3,5,7就够了,10000以内的数用100以内的素数判断足以。

>>CODE

/*------------------------------------------

*---------------------100以内的素数-------

*-----------------------------------------*/

#include

#include

void main(int argc, char* argv[])

{

int N, i, j = 0,size;

int a[] = {2,3,5,7};

if(argc < 2)

{

while(1)

{

printf("Please input a non-integer:");

if(scanf("%d", &N) != 1)

{

fflush(stdin);

continue;

} /* end if*/

break;

} /*end while*/

} /* end if*/

else

N = atoi(argv[1]);

size = sizeof(a) / sizeof(int);

printf("The primer is:");

for(i =2; i < N; i++)

{

for(j = 0; j < size; j++)

{

if(i == a[j])

printf("%d,", i);

if(i % a[j] == 0)

break;

}

if(j == size)

printf("%d,", i);

}

printf("\n");

system("pause");

} /* end main */

如果是超过了100就要补充a[]的元素,另外循环部分还要做适当改动(比如不用循环size次)。

【总结】:以上3种方法中以第3中效率最高,但是其适用性不高,只适合不大的数。当然,以上3中方法还都可以改进,以后再写。

C语言判断逆反素数,判断素数的几种方法思考[C语言]相关推荐

  1. python判断字符串出现的次数_【如何判断python字符串出现次数?这几种方法你一定要学会】- 环球网校...

    [摘要]python应用阶段是实际的工作经验,现在如何判断python字符串出现次数?这几种方法你一定要学会,小编建议大家可以试着理解这些内容,也许对您的python学习有帮助,毕竟实践出真知,所以你 ...

  2. php判断数组的值是否为空,PHP判断数组是否为空的常用方法(五种方法)

    本文介绍了PHP开发中遇到的数组问题,小编在这里给大家总结了5中方法关于php判断数组是否为空问题,需要的朋友参考下 本文介绍了PHP开发中遇到的数组问题,这里介绍了判断PHP数组为空的5种方法,有需 ...

  3. Linux下判断磁盘是SSD还是HDD的几种方法

    文章目录 1.使用Linux相关命令 2.linux查看磁盘所在槽位 1.使用Linux相关命令 方法1: 如果是直通盘,即JBOD模式,方法则正确 如果返回1则表示磁盘可旋转,那么就是HDD了:反之 ...

  4. js中判断文本框是否为空的两种方法

    js中判断文本框是否为空的两种方法 //用户名非空验证 function checkUserName(){ var name = document.myform.txtUser; //在这里我认为: ...

  5. jQuery判断复选框是否选中的三种方法

    jQuery判断复选框是否选中的三种方法. PS:下面的代码为通过循环找到在多个复选框中被选中的复选框,并对其删除 //判断复选框是否选中的第一种方法: $.each(buttons,function ...

  6. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  7. c语言调用graphviz_c语言分析函数调用关系图(call graph)的几种方法

    一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是<Understanding The Linux Virtual Memory Manag ...

  8. C语言中三个数比较大小详解——三种方法

    ​ C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...

  9. 判断一个数是否为质数的三种方法

    转载自:https://blog.csdn.net/m0_37586991/article/details/79673837?depth_1-utm_source=distribute.pc_rele ...

  10. 素数打表(4种方法)

    1既不是素数也不是合数 打表:是一种典型的用空间换时间的做法,一般指将所有可能需要用到的结果事先计算出来,这样以后后面需要用到时就可以直接查表获得. 在什么情况下我们需要打表? (1)在程序中一次性计 ...

最新文章

  1. 模板 - 无向图的连通性
  2. JAVA秒杀mysql层实现_Java高并发秒杀API之web层
  3. Elastic-Job任务类
  4. JAVA 编程-张晨光-专题视频课程
  5. 让 .Net 更方便的导入导出 Excel
  6. 京东11.11携手小米上线“信用试”服务 手机先试用满意再付款
  7. .net 中的DllImport
  8. 工控领域组态软件开发感触
  9. 西门子杯大赛比赛总结与体会
  10. Charles MOCK 数据 htpps代理
  11. Word合并所有段落再按字数划分段落
  12. 如何写一个高逼格 README
  13. 利用Beacon 监控Tuxedo
  14. 第一章 FANUC数控机床采集方案
  15. DLL线程中坑爹的Synchronize?
  16. java越野车架_越野怪兽 JAVA摆渡人 (ANIMA)山地车
  17. 展会预告丨第五届数字中国建设成果展览会亮点前瞻:大象机器人展示高科技,带来新体验
  18. 栅格计算器(不断更新中.....)
  19. java的public_java中public用法
  20. 华硕笔记本计算机名称,华硕NB是如何命名的?5招教你看清楚

热门文章

  1. 如何开发一个App(Android),Android开发技巧
  2. 思步网6月底再次重磅出击:《CrystalBall User Manual 7.3(水晶球操作手册7.3)中英文对照版》
  3. 华为路由器支持ftp服务器,如何配置华为路由器的FTP
  4. linux怎么运行teamv,TeamViewer 9发布-在Linux下安装运行
  5. fmea第五版pfmea表格_FMEA第五版中文版.pdf
  6. Python官方文档入门小教程
  7. c语言第三章作业3.13,c语言谭浩强第1章至第3章测试试题
  8. 2.1 TCP/IP命令(Ping)
  9. Python-变分模态分解(VMD)python代码及其测试用例
  10. STM32的新编译软件STM32CubeIDE