当前位置: 首页 > backend >正文

C语言--输入一个数判断是否为素数(多种方法)

 需要解决这个问题,首先我们要明白-------->什么是素数?

(质数)素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

举个例子:4  可以 由2*2=4  和1*4 得到,不符合素数的条件,所以不是素数。

                  5  只能由1*5 得到,符合素数的条件,所以是素数。

好了现在,我们了解了素数的概念,我们就把它转化成代码的思想,进行我们的操作了。

1.  第一种方法,这种方法的思想也是最直接最普遍的,假设这个数是n,我们需要判断素数,我们就拿这个数和从(2~~n-1)的每个数去和这个数做取余操作,如果有一个数可以使得余数为0,则这个数不是素数,反之则这个数为素数。

好了接下来我们用代码实现

#include <stdio.h>
int main()
{int i=0;int j=0;printf("输入一个数 "); scanf("%d",&j);for(i=2;i<j;i++){if(j%i==0){printf("%d 不是素数",j); break;}}if(j==i){printf("%d 是素数",j); }if(j==1){printf("%d 不是素数",j); }return 0;} 

 代码的具体实现就在上面,可能有的同学对if语句中为什么当j==i时,就输出是素数。

 不要着急,我给大家捋捋思路,我们可以思考一下,如果在(2~~j-1)中的每一个数都没满足取余操作后余数为0,那这时我的 i 应该 等于j-1,但我们的 i 由于满足i<j还会继续进行++操作,然后我的 i 就等于j ,此时已经不满足i <j 的条件,我们就会跳出for循环,此时我们就可以认为,当 i==j时,这个数为素数。

2.第二种方法,我们对第一种方法进行优化,我们通过下述例子分析可知,每个数的因数中,其中一个不会超过本身的1/2,所以我们可以利用这个思想对代码进行优化。

我们其实并不需要对(2~~n-1)的全部数进行上述操作,我们可以只对(2~~n/2)的全部数进行上面的操作就可以了,这样可以简化我们的计算范围。

举个例子:4  可以 由2*2=4  和1*4 得到,因数 2,2或1,4,每组其中的一个因数不大于自身(4)的1/2。

好了接下来我们用代码实现

#include <stdio.h>
int main()
{int i=0;int j=0;printf("输入一个数 "); scanf("%d",&j);for(i=2;i<=j/2;i++){if(j%i==0){printf("%d 不是素数",j);break;}}if(j==1){printf("%d 不是素数",j);}if((i>j/2) && (j!=1)){printf("%d 是素数",j);}return 0;
}

 大家觉得还能对代码思想进行优化吗?🤭🤭

答案是肯定的!

3.第三种方法,我们对第二种方法进行优化,我们通过下述例子分析可知,每个数的因数中,其中一个不会超过本身的开方,这样我们又缩小了我们的计算范围,所以我们可以利用这个思想再次对代码进行优化。

举个例子:16 可以 由1*16,2*8和4*4,得到,因数1,16和2,8和4,4每组其中的一个因数不大于本身(16)的开方(4)。

好了接下来我们用代码实现

#include <stdio.h>
#include<math.h>
int main()
{int i=0;int j=0;printf("输入一个数 "); scanf("%d",&j);for(i=2;i<=sqrt(j);i++){if(j%i==0){printf("%d 不是素数",j);break;}}if(j==1){printf("%d 不是素数",j);}if((i>sqrt(j)) && (j!=1)){printf("%d 是素数",j);}return 0;
}

 因为用到了数学中开平方的函数,所以引用了多一个库,这个不做过多讲解,大家自行去了解。

当然判断素数不知有上述的方法,还可以通过函数进行实现。

4.第四种方法(函数实现)

具体的代码思想和第一种方法一样,不再讲解。

好了接下来我们用代码实现

#include <stdio.h>
int judge(int n)
{int i=0;for(i=2;i<n;i++){if(n%i==0)return 0;}if(n==1){return 0;}return 1;
}
int main()
{int j=0;printf("输入一个数"); scanf("%d",&j);if(judge(j)==1)printf("%d 是素数",j);elseprintf("%d 不是素数",j);return 0;	
}

 这种思想和第一种一样,所以也可以像第二,三种那样对代码进行优化,这里就不过多讲解了(累了累了嘞😵😵)

遇到的问题:我思考了好久,在纠结当输入1的时候的这种情况应该怎么去调整代码,大家能看到我每块代码都用了If语句对是不是1进行了判断,(能力有限😥😥)所以我能想到的方法就是通过 if 语句对输入的1进行判断,如果不用这个if语句,那输入1 的时候结果可能就有问题,但我觉得这样会不会太麻烦了,但我又想不出来怎么去调整。

有没有大佬能指点指点我(但是尽量简单点我怕我听不懂😭😭)

(初级大二软工在读小白)用来整理自己的基础知识,如果写的有什么不对的地方,还望各位大佬指出!

http://www.xdnf.cn/news/11537.html

相关文章:

  • 刘涛入职阿里P10,年薪150W+:不做演员,也很优秀
  • 2023年国科大杨力祥《高级操作系统》期末思考题汇总
  • IT老王:Android 之 App开发基础
  • 你心心念念的小程序如何测试,这篇文章将告诉你
  • 亚交联盟怎么样?我的真实经历
  • 缠中说禅_如何判断“背驰”?缠中说禅中的各种背驰
  • App 测试工具大全,收藏这篇就够了
  • JS switch case语句详解
  • Wireshark零基础使用教程(超详细)_wireshark使用教程入门
  • ansys计算机热仿真,ANSYS仿真软件热分析
  • 推荐5款热门的Web前端开发框架,助你快速构建优秀网站
  • 2024年最新Python教程分享,10款超好用的Python开发工具!,怒斩获了30家互联网公司offer
  • 长沙电销机器人排名_长沙电销机器人公司招聘
  • 5 款漏洞扫描工具:实用、强力、全面(含开源)
  • 什么是线程死锁?如何避免死锁?
  • 【iOS开发-22】navigationBar导航条和navigationItem设置:基本搞定导航条上的文字和按钮以及各种跳转
  • Metasploit Framework-安全漏洞检测工具使用
  • 常用SQL语句(基础篇)
  • Proteus与Multisim哪款更适合51单片机仿真?
  • 清空StringBuilder的三种方法及效率
  • Debian9.5系统DNS服务器BIND软件配置说明
  • string.empty null
  • Predix总括
  • Yslow的用法以及安装后无法使用
  • 分享75个ASP江湖论坛源码,总有一款适合您
  • DoDataExchange函数,UpdateData(TRUE)和UpdateData(FALSE)的区别
  • ROI 详解
  • Gradle version 2.10 is required. Current version is 2.8.
  • Node.js超详细教程!
  • eXosip sip