今天学校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语言之判断质数算法的更多相关文章

  1. 基于R语言的梯度推进算法介绍

    通常来说,我们可以从两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法.通过大量数据科学竞赛的试炼,我们可以发现人们更钟爱于Bo ...

  2. isprime_判断质数

    判断质数的方法有很多,首先是最简单的试除法,判断n以内的质数的话时间复杂度为n*sqrt(n)当然是很慢的了 下面提供三种判断质数的方法: 首先是跑5051ms的这个是埃拉托斯特尼筛法 且不加优化 核 ...

  3. C# 判断质数的2种基本方法

    质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 目前学习了判断数字n是否为质数的2种基本方法: 一.计数法 根据定义,既然质数只 ...

  4. 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...

  5. C语言实现粒子群算法(PSO)二

    上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*( ...

  6. C语言实现粒子群算法(PSO)一

    最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等.当时是使用MATLAB来实现的,而 ...

  7. c语言 如何判断是不是 可显字符

    c语言 如何判断是不是 可显字符int isprint(int c)若可显示返回1,否则0:要包含头文件ctype.h

  8. 李洪强漫谈iOS开发[C语言-043]-判断较早日期

    李洪强漫谈iOS开发[C语言-043]-判断较早日期

  9. JAVA判断质数

    好久没写了,今天做题有点忘了,不会写了.重新做了一份,整理出来. import java.util.Scanner; public class 判断质数 { public static boolean ...

随机推荐

  1. glibc-2.18升级

    1.下载文件下载地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.18.tar.gz 2.安装部署解压tar -zxvf glibc- ...

  2. Luogu_P1613跑路

    跳转链接 题目大意 题目中要求的是从1号点到n号点所需要的最短时间, 一秒可以走 \(2^k\) 个距离 给定的有向图的边边权都是1. 问题分析 由于一秒可以走 \(2^k\) 个距离,因此题目转化为 ...

  3. 后缀自动机 (SAM)

    后缀自动机 定义 定义 SAM 为一个有限状态自动机,接受且仅接受 \(S\) 的一个后缀. 同时,SAM 是这样的自动机中最小的那个,其中状态数至多为 \(2n - 1\),转移数至多为 \(3n ...

  4. JSP response.setCharacterEncoding与response.setContentType的区别

    问题描述 昨天在参考别人的项目时,发现页面引用js,css等文件总是乱码,后来才发现是MIME类型统一设置为text/html,并且仅仅编码设置了浏览器端的解析编码.另外,可以先通过文本编辑器(如no ...

  5. docker简介及安装(1)

    Docker简介 软件开发中最为麻烦的事情可能就是配置环境了.由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且 ...

  6. War包是什么??

    感谢大佬: https://blog.csdn.net/Stitch__/article/details/88091745 https://www.jianshu.com/p/3b5c45e8e5bd ...

  7. UIView属性的讲解

    1.父控件和子控件的理解在storyboard中只有UIView是可以在里面拖入子控件的,其他控件不可以(必须通过代码添加)拖入一个UIView控件,在里面添加一些子控件(UIView控件是控制器的V ...

  8. homestead 入坑安装

    1.在使用 Homestead 之前,需要先安装 Virtual Box.VMWare.Parallels 或 Hyper-V (四选一,我们通常选择 VirtualBox,因为只有它是免费的)以及  ...

  9. ARC下的内存管理

    1.ARC下单对象内存管理 局部变量释放对象随之被释放 int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = ...

  10. Lvs+Keepalived+MySQL Cluster架设高可用负载均衡Mysql集群

    ------------------------------------- 一.前言 二.MySQL Cluster基本概念 三.环境 四.配置 1.LB-Master及LB-Backup配置 2.M ...