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 ...
随机推荐
- 【免杀技术】Tomcat内存马-Filter
Tomcat内存马-Filter型 什么是内存马?为什么要有内存马?什么又是Filter型内存马?这些问题在此就不做赘述 Filter加载流程分析 tomcat启动后正常情况下对于Filter的处理过 ...
- C++学习Day 1
c++的函数需要声明才能再写他的定义,声明可以写多次,如果执行在main之前可以不写,全写不会犯错,现在看好像c++的函数定义里没有out,也没有变量的public和private(后面有再改) 声明 ...
- IDEA导入maven项目时,报各种包找不到--com.sunyard.encrypt.function
IDEA错误归类 问题描述1 IDEA启动项目时,报maven引入的包找不到 暂时解决办法 问题描述2 IDEA启动项目时,报普通项目引入的包找不到 解决办法 总结: 问题1和问题2的解决办法明显冲突 ...
- C语言中缀表达式求值(综合)
题前需要了解的:中缀.后缀表达式是什么?(不知道你们知不知道,反正我当时不知道,搜的百度) 基本思路:先把输入的中缀表达式→后缀表达式→进行计算得出结果 栈:"先进先出,先进后出" ...
- 使用Maven导入MySQL驱动包遇到的问题
问题描述 今天在使用Maven导入MySQL数据库驱动包依赖后,直接运行项目,出现错误. java.sql.SQLException: No suitable driver found for jdb ...
- Win10 提示凭证不工作问题
感谢大佬:https://cloud.tencent.com/developer/article/1337081 在公司局域网远程自己计算机的时候,突然无法远程了,提示"您的凭据不工作 之前 ...
- 入门 - k8s滚动更新部署中的镜像版本 (七)
目标 使用 kubectl 执行 Rolling Update(滚动更新) 更新应用程序 用户期望应用程序始终可用,为此开发者/运维者在更新应用程序时要分多次完成.在 Kubernetes 中,这是通 ...
- yum本地源仓库安装报错 被锁定如何解决?
yum安装报错被锁定如何解决 上图!!!!!如图的报错 解决方法: 是不是很简单 智商在地上摩擦~~~
- Jenkins--持续集成及Jenkins介绍
Jenkins--持续集成及Jenkins介绍 目录 Jenkins--持续集成及Jenkins介绍 一.持续集成及Jenkins介绍 1. 软件开发生命周期 1.1 需求分析 1.2 设计 1.3 ...
- 深入Java微服务之网关系列1:什么是网关
前言 近来,在想着重构一个新的产品.准备采用微服务的技术解决方案,来搭建基础设施框架.网关,是一个必不可少的组件.那么,网关到底是什么? 其又有什么特点或者特性,成为微服务必不可少的组件呢?今天, ...