C语言 | 素数求解

目录

1、什么是素数

方法1、基础求解(逐个试除)

算法优化

方法2、利用平方根求解

总结

提示:关于for循环


1、什么是素数

 求素数,首先我们要知道什么是素数,这是我在百度百科上找的关于素数的定义。素数就是只能被1和自身整除的正整数。C语言 | 素数求解_第1张图片 2、C语言实现找素数

  我们已经知道什么是素数了,那接下里我们就用C语言来实现,判断一个数是不是素数。
  我们以100~200为例子。

方法1、基础求解(逐个试除)

试除法就是把在该数之前的数都拿来除一遍,如过有余数为0,则不是素数。

代码及运行结果如下:

#include
int main()
{
	int a = 200;
	int i = 0;
	int j = 0;
	int count = 0;
	//100~200遍历
	for (i = 2; i <= a; i++)
	{
		//设置标记
		int flag = 1;
		//逐个试除
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				//余数为0,标记改变
				flag = 0;
				break;
			}
		}
		//if语句非0为真,查看标记是否改变
		if (flag)
		{
			//统计个数
			count++;
			//打印素数
			printf("%d ", i);
		}
	}
	printf("\n总共有%d个", count);
	return 0;
}

C语言 | 素数求解_第2张图片

算法优化

我们知道,除了2这个数,其他素数都是奇数,那我们就用判断奇数就行(如果计算包含2,记得把2带上)。

另外算到该数的1/2的时候就能判断出该数不是素数,那就没必要往后再算。

优化代码及运行结果如下:

#include
int main()
{
	int a = 200;
	int i = 0;
	int j = 0;
	int count = 0;
	//从101开始,每次自增2,遍历奇数
	for (i = 101; i <= a; i+=2) 
	{
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				//余数为0跳出循环
				break;
			}
			//大于或等于该数的1/2则为质数
			if (j >= i / 2)
			{
				count++;
				printf("%d ", i);
				break;
			}
		}
	}
	//打印个数 
	printf("\n总共有%d个", count);
	return 0;
}

C语言 | 素数求解_第3张图片

 方法2、利用平方根求解

一个数m能够写成a*b的方式的时候,a和b中至少有一个数字是小于等于m开平方的
例子:
16 = 2 * 8 = 4 * 4 ;  2<4  4<=√16
36 = 4 * 9 = 6 * 6;   4<6  6<=√36
32 = 4 * 8  ;4 < √32

所以说,能在开平方之前找到一个因子,那一定也能在开平方后面找到因子;反之,开平方前面找不到一个因子,那在开平方后面也一定找不到因子

那我们每次计算,只需要试除到开平方m之前就行 

代码及运行结果如下:

#include
#include
int main()
{
	int a = 200;
	int i = 0;
	int j = 0;
	int count = 0;
	//遍历3~100之间的奇数
	for (i = 101; i <= a; i+=2)
	{
		//设置标记
		int flag = 1;
		//试除开平方之前的数
		//sqrt为开平方的库函数,需包含的头文件
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				//余数为0,标记改变
				flag = 0;
				break;
			}
		}
		//if语句非0为真,查看标记是否改变
		if (flag)
		{
			//统计个数
			count++;
			//打印素数
			printf("%d ", i);
		}
	}
	printf("\n有%d个素数", count);
}

C语言 | 素数求解_第4张图片

 这样就大大的减少了运算的次数,提高了效率,到这里也不妨看一下每种方法计算次数。

C语言 | 素数求解_第5张图片

 总结

  代码通过一点一点的改良,我们可以明显看出,运算次数的减少。不要局限于固定思维,多看多学好的代码风格和代码,对自己提升更有帮助,希望这篇文章对大伙有帮助,看到这里了,不妨点个赞再走,哈哈,日后还会陆续更新文章,诚邀各位观看指点!

提示:关于for循环

写法1是C语言的写法,写法2是C++的写法,当然这并不冲突。但建议我们在写C的时候,还是按照C的写法来。C语言 | 素数求解_第6张图片

你可能感兴趣的:(C语言,原创,c语言,算法)