素数求解(5种方法)

  • 目录

    前言

    一、什么是质数(素数)

    质数:

    二、求素数的几种方法

    1.遍历

    2.优化1:减少遍历的长度

    3 .优化2:剔除偶数

    4.利用平方根函数

    5.剔除法

    三.总结


前言

代码能力,能从对一个代码的不断优化中提高,在求素数代码的一次次优化中,提高自己的代码能力。以打印100-200间的素数为例子


一、什么是质数(素数)

质数:

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

例如:2,3,5,7,11,13,17,19,23...........

不难看出 ,素数除了2之外 都是奇数...

二、求素数的几种方法

求素数的基本思想就是不断试除,对这个区间内的所有数进行遍历,而最常用的遍历方法就是利用for循环;

思路:定义三个int变量:i,j,flag=0
②最外层定义一个for循环,确定被除数i的范围区间100~200
③下面再嵌套一层for循环,确定除数j的区间,j应该从2开始,直到等于i
④写一个if判断语句,利用取余公式i%j来确定其余数是否为0:若为0,就说明i可以整除j,则退出循环;

1.遍历

#include
int main()
{
	int i, j;
	int flag = 0;
	int count1 = 0;
	int count2 = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j <= i; j++)
		{
			if (i % j == 0)
			{
				break;
			}
			count1++;
		}
		count2++;
		if (i == j)
			printf("%d  ", i);
	}
	printf("\n内层count=%d", count1);
	printf("\n外层count=%d", count2);
	return 0;
}

定义了一个count来计算循环的次数内层 count=3212 外层count101

2.优化1:减少遍历的长度

代码如下:

#include
int main()
{
	int i, j;
	int flag = 0;
	int count1 = 0;
	int count2 = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j <= (i / 2); j++)
		{
			if (i % j == 0)
			{
				break;
			}
			count1++;
		}
		count2++;
		if (j >= i / 2)
			printf("%d  ", i);
	}
	printf("\n内层count=%d", count1);
	printf("\n外层count=%d", count2);
	return 0;
}

观察的到外层循环101次内层循环1639次


3 .优化2:剔除偶数

我们发现所有的除了2之外的所有偶数都不是素数

#include
int main()
{
	int i, j;
	int flag = 0;
	int count1=0;
	int count2 = 0;
	for (i = 101; i <=200; i+=2)
	{
		for (j = 2; j <=i; j++)
		{
			if (i % j == 0)
			{
				break;
			}
			count1++;
		}
		count2++;
		if (j>=i/2)
			printf("%d  ", i);
	}
	printf("\n内层count=%d", count1);
	printf("\n外层count=%d", count2);
	return 0;
}

4.利用平方根函数

100 可以用 1 * 100 2 * 50 4 * 25 5 * 20 * 10 * 10表示,肯定会有细心的小伙伴发现
每个式子中总会有一个数小于等于100开平方,所以才有了这种方法

#include
#include
int main()
{
	int i, j;
	int flag = 0;
	int count1 = 0;
	int count2 = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				break;
			}
			count1++;
		}
		count2++;
		if (sqrt(i) <= j)
			printf("%d  ", i);
	}
	printf("\n内层count=%d", count1);
	printf("\n外层count=%d", count2);
	return 0;
}

 可以看到相较于前几种方法,这一方法内层运行次数大大减少!!!

5.剔除法

首先除了2之外质数均为奇数,其次前面所求的质数的倍数不再为质数

由此诞生了剔除法;顾名思义,就是将偶数,质数的整数倍剔除出去!

#include
int main()
{
	int i = 0;
	int count = 0;                  
	for (i = 101; i < 200; i += 2) 
	{
		if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0 && i % 11 != 0 && i % 13 != 0)  
		{
			printf("%d ", i);
		}
		count++;
	}
	printf("\ncount=%d\n", count);
	return 0;
}

运行次数很少!!!较为便捷

三.总结

在一次次优化中,代码不断改进,效率不断提升,自身能力也如同这代码的优化一般,越来越完美,试问自己 还可以优化多少呢?

你可能感兴趣的:(c语言)