C语言之判断质数算法
今天学校OJ的一题判断是质数和合数。
首先我们要弄明白质数和合数的概念:质数就是除了本身和1以外没有其他因数的数,合数就是除了本身和1以外还有其他因数的数。注意:1既不是质数也不是合数。
明白了概念,下面在考虑题目本身。
1、输入 :输入待判断的数n。(额外要求 2<=n<10000,且可连续输入)。
2、输出:质数:’Yes‘ ,合数:’No‘。
那么如何判断是否为质数和合数呢?
质数就是除了本身和1以外没有其他因数的数。
那么就只用遍历2~n-1中的数,让他们逐个与n取余。只要其中一个数可与n取余得0,即为可整除,即可判断不是质数,是合数。
如下算法:(需注意的是2在判断时需额外判断,因为2~n-1会报错。)
1 #include
2 int main()
3 {
4 int n;
5 while(scanf("%d",&n)!=EOF)
6 {
7
8 if (2<n<10000)
9 {
10 int flag=1;
11 for (int i=2;i<=n-1;i++)
12 {
13 if (n%i==0)
14 {flag=0;
15 break;}
16 }
17 if (flag) printf("Yes\n");
18 else printf("No\n") ;
19 }
20 else if (n==2) printf("Yes\n");
21 else printf("输入错误\n");
22 }
23 return 0;
24 }
以上算法的复杂度是O(n),最差的情况下运行n次。如需改进,我们可以在整除的地方思考一下,要判断n在2~(n-1)处是否能整除,而在大于n/2时无论其取何值,都不可能使n被整除,所以只要判断2~n/2之间的数是否能整除n即可。
代码如下:
1 #include
2 int main()
3 {
4 int n;
5 while(scanf("%d",&n)!=EOF)
6 {
7
8 if (2<n&&n<10000)
9 {
10 int flag=1;
11 for (int i=2;i<=n/2;i++)
12 {
13 if (n%i==0)
14 {flag=0;
15 break;}
16 }
17 if (flag) printf("Yes\n");
18 else printf("No\n") ;
19 }
20 else if (n==2) printf("Yes\n");
21 else printf("输入错误\n");
22 }
23 return 0;
24 }
实际上我们可以证明,如果n不是素数,那么n必须有一个大于1且小于或者等于√n。证明过程:
因为n不是素数,所以会存在两个数p和q,满足n=pq且1<p≤q。注意到n=√n*√n。p必须小于等于√n。
所以代码可改为如下:
1 #include<stdio.h>
2 #include<math.h>
3
4 int main()
5 {
6 int n;
7 while(scanf("%d",&n)!=EOF)
8 {
9
10 if (3<n&&n<10000)
11 {
12 int flag=1;
13 for (int i=2;i<=(int)sqrt(n);i++)
14 {
15 if (n%i==0)
16 {flag=0;
17 break;}
18 }
19 if (flag) printf("Yes\n");
20 else printf("No\n") ;
21 }
22 else if (n==2||n==3) printf("Yes\n");
23 else printf("输入错误\n");
24 }
25 return 0;
26 }
这就是今天get到的一个算法。
此外,通过我的思考我解决了一个我遇到的一个问题。在循环判断语句中,根据判断条件会进行循环判断,如果要待循环全部进行完进行一个总的判断,可设置一个标志变量记录。(就比如本题,要等所有在区间内的数全部测试是否能整除,才能判断是否为质数,这时可添加一个局部变量flag来记录每次循环判断的值并最终进行汇总)。
路漫漫~~~~
C语言之判断质数算法的更多相关文章
- 基于R语言的梯度推进算法介绍
通常来说,我们可以从两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法.通过大量数据科学竞赛的试炼,我们可以发现人们更钟爱于Bo ...
- isprime_判断质数
判断质数的方法有很多,首先是最简单的试除法,判断n以内的质数的话时间复杂度为n*sqrt(n)当然是很慢的了 下面提供三种判断质数的方法: 首先是跑5051ms的这个是埃拉托斯特尼筛法 且不加优化 核 ...
- C# 判断质数的2种基本方法
质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 目前学习了判断数字n是否为质数的2种基本方法: 一.计数法 根据定义,既然质数只 ...
- 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...
- C语言实现粒子群算法(PSO)二
上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*( ...
- C语言实现粒子群算法(PSO)一
最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等.当时是使用MATLAB来实现的,而 ...
- c语言 如何判断是不是 可显字符
c语言 如何判断是不是 可显字符int isprint(int c)若可显示返回1,否则0:要包含头文件ctype.h
- 李洪强漫谈iOS开发[C语言-043]-判断较早日期
李洪强漫谈iOS开发[C语言-043]-判断较早日期
- JAVA判断质数
好久没写了,今天做题有点忘了,不会写了.重新做了一份,整理出来. import java.util.Scanner; public class 判断质数 { public static boolean ...
随机推荐
- js 用 void 0 替代 undefined
underscore 源码没有出现 undefined,而用 void 0 代替之.为什么要这么做?我们可以从两部分解读,其一是 undefined 哪里不好了,你非得找个替代品?其二就是替代品为毛要 ...
- MySQL 数据库的tab 补全功能 (懒人必备)
MySQL 数据库的tab补全功能 跟着步骤走~~ 懒人养成第一步 不仅帮你补全 甚至预判你的预判,就问你可怕不可怕 1.安装相关依赖软件(需要配置yum官方 ...
- python基础——生成器与迭代器
生成器 def func(): print("111") yield 1 print("222") yield 3 print("333") ...
- 问题描述:Navicat连不上MySQL数据库
发现Navicat连不上MySQL后我首先觉得是MySQL的服务没有打开, 然后再cmd里面 启动MySQL服务 输入: net start mysql 发现没有此服务,然我网上找了一下 先初始化My ...
- 矩阵QR分解
1 orthonormal 向量与 Orthogonal 矩阵 orthonormal 向量定义为 ,任意向量 相互垂直,且模长为1: 如果将 orthonormal 向量按列组织成矩阵,矩阵为 ...
- mysql数据库 Window下安装
关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据 库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数 据项的特殊收集体,这 ...
- etcdserver: mvcc: database space exceeded
文章目录 查看节点状态 获取旧版本号 压缩旧版本 清理碎片 再次查看节点状态 清楚告警 k8s的apiserver组件重启失败,通过journalctl -xeu kube-apiserver命令查看 ...
- 如何使用IDEA工具右边栏的Database模块
理解Spring Boot自动配置数据源相关代码进行测试时总是无法链接数据库,但是其他方式链接又是没有问题.不知道哪里出现问题了,后来搜资料无意中看到idea提供了Database模块可以测试,就是用 ...
- netty系列之:channel,ServerChannel和netty中的实现
目录 简介 channel和ServerChannel netty中channel的实现 AbstractChannel和AbstractServerChannel LocalChannel和Loca ...
- 【Kotlin】初识Kotlin之面向对象
[Kotlin]初识Kotlin之面向对象 1.类 在Kotlin中,类用关键字class来定义 如果一个类具有类体,那么需要使用{ }来写类体内容,如果不需要类体,那么只需要定义类名就可以了 // ...