「这是我参与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;
}
🔑 再优化 。。。 。。。额,学废了学废了。。。。当然大家如果还有别的方法 ,希望能分享出来一起学习 🔑
//欢迎大佬补充
//欢迎大佬补充