C语言素数(质数)判断的3种方法举例

 更新时间:2023年11月03日 11:27:57   作者:小鱼小鱼酱  
这篇文章主要给大家介绍了关于C语言素数(质数)判断的3种方法,质数是只能被1或者自身整除的自然数(不包括1),称为质数,文中通过代码介绍的非常详细,需要的朋友可以参考下

摘要

本文介绍了判断素数的3种方法,从素数的概念分析,确定找到素数的几个必要条件,设计思路,并将代码进行优化。此外,还使用自定义函数的形式将同样的思路进行实现。

方法1

素数是什么

素数,就是仅能被自身和1整除的数字。

条件分析

首先我们可以提取出判断素数的三个基本条件:

素数是整数

素数能被自身整除

素数能被1整除

设计思路

以一道题为例——

求100到200之间的所有素数并输出。

大体思路

  • 遍历
    • 首先,得到100到200间的所有数字(记为a)——for循环
    • 当 A%B==0时说明A被B整除了
    • 根据两个基本条件——a能被1整除,且a能被自身整除,所以除数(记为b)应为2到a-1间的所有数字——for循环
  • 设置判断条件
    • 当a%b==0时a不是素数
    • 设置标记变量flag,当a%b==0时令flag=1;后续循环没必要进行,因此设置break;结束该循环。
    • 特别注意flag何时初始化为0

具体代码实现

#include<stdio.h>

int main()
{
	int a, b, flag;
	for (a = 100; a <= 200; a++)	//得到100到200间的所有数字
	{
		flag = 0;				 //先假设a为素数 
		for (b = 2; b < a; b++)	 //注意,不要忘了自身也能被整除!
		{
			if (a % b == 0)
			{
				flag = 1;  //若出现不能整除的情况,则令flag为1 
				break;
			}

		}						//标记变量——flag
		if (0 == flag)
			printf("%d ", a);
	}
	return 0;
}

最终结果输出为——

101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

代码优化

我们先解决一个数学问题——

若a为一个整数,则显然a=√a√a,因为√a=√a,所以若有其他数cd=a,则一定存在一个数大于√a,一个数小于√a,因此大于√a之后的数字我们不需要再进行遍历了。
(同理,如果你不想思考这么多,写个b<n/2也比全部遍历好多了)

因此第二个循环:

for (b = 2; b < a; b++)

我们可以优化为——

int k;
k=(int)sqrt((double)a);	
for (b = 2; b < a; b++)

注:求平方根函数内参数要求为double类型,因此先将a强制转换为double型,而k是整型,所以将sqrt计算返回值再进行强制转换为int型。

或者用不那么绕的写法——

int k;
k=(int)sqrt(1.0*a);		//1.0*a同样将a强制转换为double型
for (b = 2; b < a; b++)

所以优化之后的代码为——

#include<stdio.h>
#include<math.h>	//sqrt在math.h头文件中

int main()
{
	int a, b, flag;
	for (a = 100; a <= 200; a++)	//得到100到200间的所有数字
	{
		flag = 0;				 //先假设a为素数 
		int k;
		k = (int)sqrt((double)i);
		for (b = 2; b < k; b++)	 //注意,不要忘了自身也能被整除!
		{
			if (a % b == 0)
			{
				flag = 1;  //若出现不能整除的情况,则令flag为1 
				break;
			}

		}						//标记变量——flag
		if (0 == flag)
			printf("%d ", a);
	}
	return 0;
}

方法2

我在网上还看到一种思路——

大体与法1(未优化版)一致,但是没有用标记变量flag,而是判断最终b是否等于a——

#include<stdio.h>

int main()
{
	int a, b;
	for (a = 100; a <= 200; a++)	
	{
		for (b = 2; b < a; b++)	
		{
			if (a % b == 0)
			break;
		}					
		if (b == a)	  //反正要全部遍历一遍,不如把代码写得短一点~
			printf("%d ", a);
	}
	return 0;
}

注意:判断最终的b是否等于a

这里为何判断的是b等于a而非b等于a-1呢?

例如:当a=101时,进入第二个for循环,进行大量遍历后来到b=100,此时经过if判断同样不满足条件,不进入if语句。

然后就要b++,得到b=101,那么b=101时不满足b<a的条件,所以不再进入for循环,直接进入判断if(b= =a)语句,此时b与a相等。
走到这一步,说明a除了自身与1外没有能被a整除的除数,因此a为素数。

简言之,条件表达式的执行次数总是比循环体的执行次数多一次。

个人认为此方法不如标记函数思路简洁,不过仍不失为一种独特的思路。

方法3

PS:思路不变,形式变化

我们可以将给定一个数字a,判断其是否为素数的这段逻辑封装在一个自定义函数中。

以下是代码实现——

#include<stdio.h>
int fun(int a);

int main()
{
	int a,ret;
	for (a = 100; a <= 200; a++)	//得到100到200间的所有数字
	{ 
		ret=fun(a);	 //ret为返回值,通过判断ret的值确定a是否为素数
		if(ret==0)
		printf("%d ",a);
	}
	return 0;
}
int fun(int a)
{	int b;
	for (b = 2; b < a; b++)	
	{
		if (a % b == 0)
		return 1;	//若能被整除,则返回值为1,结束 
	}
	return 0;		//若不能被整除,则返回值为0,结束 
}

注意 return 1; 和 return 0; 的位置。

小结

  • 判断素数起码有三种方法
  • 特别注意标记函数的使用,灵活运行用自定义函数,注意分析for循环的逻辑顺序,注意break;使用的位置,注意sqrt函数的参量类型及头文件,注意简化遍历次数、优化方案的思路。

总结 

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

相关文章

  • 在clion上配置libtorch开发环境的图文详解

    在clion上配置libtorch开发环境的图文详解

    这篇文章主要介绍了在clion上配置libtorch开发环境的图文详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • QT圆形图像剪切功能实现

    QT圆形图像剪切功能实现

    这篇文章主要介绍了QT圆形图像剪切,实现代码包括剪切代码,完整QML源码,C++代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 基于Qt实现日志打印系统

    基于Qt实现日志打印系统

    这篇文章主要为大家详细介绍了如何利用Qt开发一个日志打印系统,可以实现打印日志按日期、大小保存,过期删除,窗口实时显示日志,网络传输日志远程调试,需要的可以参考下
    2023-12-12
  • C语言圣诞树的实现示例

    C语言圣诞树的实现示例

    本篇主要介绍了C语言圣诞树的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C++中对象与类的详解及其作用介绍

    C++中对象与类的详解及其作用介绍

    这篇文章主要介绍了C++中对象与类的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • c++ using定义类型别名的具体使用

    c++ using定义类型别名的具体使用

    本文主要介绍了c++ using定义类型别名的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • C语言递归在实践题目中应用详解

    C语言递归在实践题目中应用详解

    递归是C语言中非常重要的知识点,其中的大事化小等思想对初学C语言的小伙伴来说不是很友好,因此我整理了递归的经典题目并向外拓展,给你全面的介绍,重新认识递归
    2022-05-05
  • C++调用Matlab函数求特征值

    C++调用Matlab函数求特征值

    这篇文章主要为大家详细介绍了C++调用Matlab函数求特征值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • C++连接并使用MySQL数据库

    C++连接并使用MySQL数据库

    这篇文章主要为大家详细介绍了C++连接并使用MySQL数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Ubuntu18.04下QT开发Android无法连接设备问题解决实现

    Ubuntu18.04下QT开发Android无法连接设备问题解决实现

    本文主要介绍了Ubuntu18.04下QT开发Android无法连接设备问题解决实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论