C语言判断逆反素数,判断素数的几种方法思考[C语言]
判断素数的几种方法思考
【】判断素数是经常遇到的问题,下面就总结几种方法
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语言]相关推荐
- python判断字符串出现的次数_【如何判断python字符串出现次数?这几种方法你一定要学会】- 环球网校...
[摘要]python应用阶段是实际的工作经验,现在如何判断python字符串出现次数?这几种方法你一定要学会,小编建议大家可以试着理解这些内容,也许对您的python学习有帮助,毕竟实践出真知,所以你 ...
- php判断数组的值是否为空,PHP判断数组是否为空的常用方法(五种方法)
本文介绍了PHP开发中遇到的数组问题,小编在这里给大家总结了5中方法关于php判断数组是否为空问题,需要的朋友参考下 本文介绍了PHP开发中遇到的数组问题,这里介绍了判断PHP数组为空的5种方法,有需 ...
- Linux下判断磁盘是SSD还是HDD的几种方法
文章目录 1.使用Linux相关命令 2.linux查看磁盘所在槽位 1.使用Linux相关命令 方法1: 如果是直通盘,即JBOD模式,方法则正确 如果返回1则表示磁盘可旋转,那么就是HDD了:反之 ...
- js中判断文本框是否为空的两种方法
js中判断文本框是否为空的两种方法 //用户名非空验证 function checkUserName(){ var name = document.myform.txtUser; //在这里我认为: ...
- jQuery判断复选框是否选中的三种方法
jQuery判断复选框是否选中的三种方法. PS:下面的代码为通过循环找到在多个复选框中被选中的复选框,并对其删除 //判断复选框是否选中的第一种方法: $.each(buttons,function ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
- c语言调用graphviz_c语言分析函数调用关系图(call graph)的几种方法
一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是<Understanding The Linux Virtual Memory Manag ...
- C语言中三个数比较大小详解——三种方法
C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...
- 判断一个数是否为质数的三种方法
转载自:https://blog.csdn.net/m0_37586991/article/details/79673837?depth_1-utm_source=distribute.pc_rele ...
- 素数打表(4种方法)
1既不是素数也不是合数 打表:是一种典型的用空间换时间的做法,一般指将所有可能需要用到的结果事先计算出来,这样以后后面需要用到时就可以直接查表获得. 在什么情况下我们需要打表? (1)在程序中一次性计 ...
最新文章
- 模板 - 无向图的连通性
- JAVA秒杀mysql层实现_Java高并发秒杀API之web层
- Elastic-Job任务类
- JAVA 编程-张晨光-专题视频课程
- 让 .Net 更方便的导入导出 Excel
- 京东11.11携手小米上线“信用试”服务 手机先试用满意再付款
- .net 中的DllImport
- 工控领域组态软件开发感触
- 西门子杯大赛比赛总结与体会
- Charles MOCK 数据 htpps代理
- Word合并所有段落再按字数划分段落
- 如何写一个高逼格 README
- 利用Beacon 监控Tuxedo
- 第一章 FANUC数控机床采集方案
- DLL线程中坑爹的Synchronize?
- java越野车架_越野怪兽 JAVA摆渡人 (ANIMA)山地车
- 展会预告丨第五届数字中国建设成果展览会亮点前瞻:大象机器人展示高科技,带来新体验
- 栅格计算器(不断更新中.....)
- java的public_java中public用法
- 华硕笔记本计算机名称,华硕NB是如何命名的?5招教你看清楚
热门文章
- 如何开发一个App(Android),Android开发技巧
- 思步网6月底再次重磅出击:《CrystalBall User Manual 7.3(水晶球操作手册7.3)中英文对照版》
- 华为路由器支持ftp服务器,如何配置华为路由器的FTP
- linux怎么运行teamv,TeamViewer 9发布-在Linux下安装运行
- fmea第五版pfmea表格_FMEA第五版中文版.pdf
- Python官方文档入门小教程
- c语言第三章作业3.13,c语言谭浩强第1章至第3章测试试题
- 2.1 TCP/IP命令(Ping)
- Python-变分模态分解(VMD)python代码及其测试用例
- STM32的新编译软件STM32CubeIDE