【C语言】打印100到200间的所有素数(多种优化)

打印100到200间的所有素数。

素数:除了1和本身没有其它的因数的数称为素数。

方法: 试除法

写法一:

【思想】:用flag作为标志位,标记是否为素数。 flag 置为1,即为不是素数。 flag为0, 则是素数。 在外层for循环中判断是否打印,count计数位是否++。

【代码体现】:

int main()
{
	int count = 0; // 计算素数的个数
	int flag = 0;  // 标志位,标记是否为素数
	for (int i = 100; i <= 200; i++)
	{
		flag = 0;
		for (int j = i - 1; j >= 2; j--)
		{
			if (i%j == 0)
			{
				flag = 1;  // 将flag置为1,标识不是素数
				break;
			}
		}
		if (!flag)  // 如果flag 为0标识为素数, !flag即为非0,则count++
		{
			count++;
			printf("%d ", i);
		}
		

	}
	printf("\n总共有%d个素数\n", count);
	system("pause");
}

写法二:

【思想】:在1-i-1的for循环后,通过j的值判断是i否为素数, 代码注释中有详细说明

【代码体现】:

int main()
{
	int count = 0;
	for (int i = 100; i <= 200; i++)
	{
		// 判断i是否为素数
		// 检查 2-i-1个数是否是i的因子
		int j = 0;
		for (j = 2; j <= i - 1; j++)
		{
			if (i%j == 0)
				break;
		}
		// 在此处跳出循环的有从2-i-1检测完的,也有不符合要求break,跳出循环来到这一步的。
		// 如果j > i-1;说明从2到i-1的数全部都检测了一遍,没有i的因数
		if (j > i - 1)
		{
			count++;
			printf("%d ", i);
		}
			
	}
	printf("\n总共有%d个素数\n", count);
	system("pause");

}

还可以优化

【思想】:计算是否为i的因数时,只需要计算到根号下i,就可以。因为一个数 x 等于 x 开根号后的平方,也就是如果两个数的乘积等于x,那么这两个数肯定有一个小于 x的开根号, 而另一个大于 x的开根号。 比如64,88 = 64, 还有 232 = 64,2比8小,32比8大 ; 还有 4*16=64,4比8小,16比8大。 所以计算到比sqrt(x)小的数就可以了。

【代码体现】:

#incldue <math.h>
int main()
{
	int count = 0;
	for (int i = 100; i <= 200; i++)
	{
		// 判断i是否为素数
		// 2 - i-1
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i%j == 0)
				break;
		}
		// 
		if (j > sqrt(i)) 
		{
			count++;
			printf("%d ", i);
		}

	}
	printf("\n总共有%d个素数\n", count);
	system("pause");

}

当然,还可以继续优化

【思想】: 因为素数,不可能是偶数。所以在最外层循环中,将 for(int i = 100; i <= 200; i++) 换成 for(int i = 101; i <= 200; i+=2) 。这样循环的次数能减少一半。大大的提高了计算的效率。

【代码体现】:

int main()
{
	int count = 0;
	for (int i = 101; i <= 200; i+= 2)
	{
		// 判断i是否为素数
		// 2 - i-1
		int j = 0;
		for (j = 2; j <= i/2; j++)
		{
			if (i%j == 0)
				break;
		}
		// 
		if (j > i/2) 
		{
			count++;
			printf("%d ", i);
		}

	}
	printf("\n总共有%d个素数\n", count);
	system("pause");
}

结果

在这里插入图片描述

发布了56 篇原创文章 · 获赞 13 · 访问量 5751

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/104069814