素数(质数)是指只能被拆成"1"和"它自身"乘积的正整数。用数学语言表述就是:
a 为正整数 , 若对于任意 b,c ( b,c 是正整数且可以相等),a != b*c,则 a 为素数,反之也成立。
如何用代码实现呢? 今天小编就告诉大家。
例如:打印100 - 200 之间的素数
思路如下:
- 循环产生100 - 200 之间的数字,假定为 i
- 判断 i 是否为素数 (用 2 至 i-1 之间的数字 / i ,若都不能整除,则是素数)
- 若 i 是素数,则打印
一.非函数的解决方法
1.直接
#include<stdio.h>
int main()
{
for(int i = 100; i <= 200; i++) // 思路 1
{
int flag = 1; // 用于接收 i 是否为素数的信号
for(int j = 2; j <= i - 1; j++) // 思路 2
{
if(i % j == 0)
{
flag = 0; // 如果有被整除的,就不是,就不需要再判断了,所以跳出循环
break; // 这个 i 被 flag 标记为假
}
}
if(flag == 1) // 没有被标记为假的就是素数,打印
printf("%d ", i);
}
return 0;
}
2.算法优化
我们发现 所有偶数都不可能是素数,那是不是可以将所有偶数都剔除,只判断奇数,进而提高代码效率呢?
这里我们只需要将第一个 for 循环中的 i++ 改为 i+=2 ,同时改变 i 的值即可
3.算法再优化
我们发现:如果 a = b * c (a,b,c 均为整数) ,则 b, c 一定有一个小于根号下a。进而我们可以再优化代码
要求根号,就得请出 开平方的库函数—— sqrt
既然是库函数,就要包含头文件,这个函数的头文件是 #include<math.h>
#include<stdio.h>
#include<math.h>
int main()
{
for(int i = 101; i <= 200; i+=2) // 算法优化
{
int flag = 1;
for(int j = 2; j <= sqrt(i); j++) // 算法再优化
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
二.函数的解决方法
综合逻辑的算法以及优化都与上面相似
#include<stdio.h>
#include<math.h>
int is_prime(int i)
{
for (int j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
return 0; // 不是素数
}
}
return 1; // 是素数
}
int main()
{
for (int i = 101; i <= 200; i+=2)
{
if (is_prime(i))
printf("%d ", i);
}
return 0;
}
三.运行结果
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。
小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。
如果有建议欢迎在评论区或私信留言,小编才能发布更优秀的文章。感谢您的大力支持。