输出100-200之间的素数

2,232 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

❗ 素数 ❕

    素数(质数):只能被 1 和它本身整除的数。 注:1 不是素数

🔑 如果是素数就要不断的去试除来证明,直到全部排除 🔑

#include<stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for(i = 100; i <= 200; i++)
    {
	//判断i是否为素数
	//试除区间:2->i-1	
	for(j = 2; j < i; j++)//这里就排除了1和素数本身	 
	{
            if (i % j == 0)
                break;
            if (i % j != 0 && j == i - 1)
		printf("%d ", i);
	}
    }
    return 0;
}

🔑 优化:相反不是素数则有一个数满足条件 (能被除了1和它本身的数整除) ,它就不是素数 🔑

#include<stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for(i = 100; i <= 200; i++)
    {
	for(j = 2; j < i; j++)
	{
            //非素数,直接break
            if (i % j == 0)
                break;
	}
	//这里说明i已经将所有的数试除了,所以这个数是素数
	if (i == j)
            printf("%d ", i);
    }
    return 0;
}

🔑 使用 flag 标志。这是另一种方法 - 每道题都可能有不同的解决方法,多思考从各个角度解决问题 🔑

#include<stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for(i = 100; i <= 200; i++)
    {
	int flag = 1;//给1个标记
	for(j = 2; j < i; j++)
	{
            if (i % j == 0)
            {
                flag = 0;//如果是素数则将标记赋值为0
		break;
            }
        }
	if (1 == flag)//1是素数,0不是素数
            printf("%d ", i);
    }
    return 0;
}

🔑
  优化思路:减少试除的次数
   m = a * b
   a 和 b 中至少有一个数字是 <= 开平方 m 的;如果在开平方 m 之前找到 1 个因子能够整除 m 的话,那就可以不用找另 1 个因子了
   16 = 2 * 8 = 4 * 4
   也就是说如果能找到 2 能够整除 16 的话,就没必要去找 8 能不能整除 16 了
   在之前是使用i去试除 2 -> i - 1 之间的数;现在是试除 2 -> sqrt(i) 之间的数
🔑

#include<stdio.h>
#include<math.h>
int main()
{
    int i = 0;
    int j = 0;
    for (i = 100; i <= 200; i++)
    {
	int flag = 1;
	for (j = 2; j <= sqrt(i); j++)//sqrt是开平方函数,所在头math
	{
            if (i % j == 0)
            {
                flag = 0;
		break;
            }
	}
	if (1 == flag)
            printf("%d ", i);
    }
    return 0;
}

🔑 再优化:偶数有可能是素数吗? - 当然是不可能的 🔑

#include<stdio.h>
#include<math.h>
int main()
{
    int i = 0;
    int j = 0;
    for (i = 101; i <= 200; i+=2)//101、103、105、107...(从源头上跳过偶数)
    {
	int flag = 1;
	for (j = 2; j <= sqrt(i); j++)//sqrt是开平方函数,所在头math
	{
            if (i % j == 0)
            {
		flag = 0;
		break;
            }
        }
	if (1 == flag)
            printf("%d ", i);
    }
    return 0;
}

🔑 再优化 。。。 。。。额,学废了学废了。。。。当然大家如果还有别的方法 ,希望能分享出来一起学习 🔑

//欢迎大佬补充
//欢迎大佬补充

image.png