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

 更新时间:2023年04月23日 10:11:25   作者:洋-----  
素数是只能被1和它自己本身整除,不能被其他自然数整除的大于1的正整数,下面这篇文章主要给大家介绍了关于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);
	else
	printf("%d 不是素数",j);
	return 0;	
}

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

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

总结

到此这篇关于C语言输入一个数判断是否为素数的多种方法的文章就介绍到这了,更多相关C语言判断是否为素数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言自定义实现strlen函数的3种方法总结

    C语言自定义实现strlen函数的3种方法总结

    这篇文章带大家了解C语言中自定义实现strlen函数的3种方法,计数器,递归以及指针,这三种方法通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • C++进化后的const变量实例探究

    C++进化后的const变量实例探究

    这篇文章主要为大家介绍了C++进化后的const变量实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 深度解析三个常见的C语言内存函数

    深度解析三个常见的C语言内存函数

    这篇文章主要深度解析了三个常见的C语言内存函数memcpy,memmove,memcmp,所以本文将对memcpy,memmove,memcmp 三个函数进行详解和模拟实现,需要的朋友可以参考下
    2023-07-07
  • C++读取NC数据的结果与真实数值不一致的解决方法

    C++读取NC数据的结果与真实数值不一致的解决方法

    本文介绍基于C++ 语言的netCDF库读取.nc格式的栅格文件时,代码读取到的数据与栅格文件的实际数据不一致的解决方法,文中通过代码示例和图文讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • 常用的C++标准库头文件小结

    常用的C++标准库头文件小结

    C++标准库定义了一系列函数、宏和对象,以实现跨团队、跨平台的高效且具有卓越性能的标准化 C++ 代码, 本文介绍常用的C++标准库头文件,需要的朋友可以参考下
    2023-11-11
  • C++超详细分析顺序表

    C++超详细分析顺序表

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-03-03
  • 简单说说STL的内存管理

    简单说说STL的内存管理

    <STL 源码剖析>将其描述为空间配置器,理由是allocator可以将其它存储介质(例如硬盘)做为stl 容器的存储空间。由于内存是allocator管理的主要部分,因此,本文以STL内存管理为出发点介绍allocator
    2013-09-09
  • C语言实现xml构造解析器

    C语言实现xml构造解析器

    本文给大家分享的是使用C语言来实现xml构造解析器的方法和代码,简单易用,推荐给大家
    2016-07-07
  • C++ OpenCV实战之网孔检测的实现

    C++ OpenCV实战之网孔检测的实现

    这篇文章主要介绍了如何利用C++和OpenCV实现网孔检测,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,感兴趣的小伙伴可以了解一下
    2022-05-05
  • C++ sqlite3数据库配置使用教程

    C++ sqlite3数据库配置使用教程

    SQLite 是一种嵌入式的关系型数据库管理系统,它是一个开源项目,已经被广泛应用于各种应用程序和操作系统中,这篇文章主要介绍了C++ sqlite3数据库配置使用,需要的朋友可以参考下
    2023-08-08

最新评论