- 何为素数?
- 是一个大于1的自然数,除了1和它自身以外,不能被其他自然数整除的数
- 例如:11这个数,11只能被1和11整除,这样的数称之为素数(也叫质数)
- 如何判断一个数是否为素数
- 素数的特征:只能被1和本身整除
- 假设有一个整数:n,如何判断n是否为素数呢(试除法)
- 根据素数的特点,遍历 2 ~ (n-1) 的数
- 看n是否能被2 ~ (n-1) 之间的数整除,如果能被整除,则n就不是素数,如果不能被整除,则n就是素数
- 解题思路
遍历100~200之间所有整数
//遍历100~200之间的数
for (int n = 100; n <= 200; n++)
{
//判断n是否为素数
}
再在for循环内部遍历 2 ~ (n-1) 的数,并用n % (2 ~ (n-1)) 的数,看n是否能被整除
//遍历100~200之间的数
for (int n = 100; n <= 200; n++)
{
//遍历2~(n-1)的数
for (int j = 2; j < n; j++)
{
if (n % j == 0)
{
}
}
}
- 立一个flag,最开始值为1,
- 当 n%j == 0 的if条件成立时,则表示此时的n不为素数,
- 这时则把flag置为0,
- 当flag置为0时就不用再判断当前的n是否为素数了,则break跳出此次的内部for循环,
- 再判断flag的值,为1则表示当前外部for循环的n是素数,为0则表示当初外部for循环的n不是素数
#include<stdio.h>
int main()
{
//遍历100~200之间的数
for (int n = 100; n <= 200; n++)
{
//插旗,用来标记n是否为素数,假设flag为1时,n就是素数
int flag = 1;
//遍历2~(n-1)的数
for (int j = 2; j < n; j++)
{
if (n % j == 0)
{
//当n能被除了1和自身以外的数除净时,此时的n就不是素数,所以将flag置为0
flag = 0;
break;
}
}
//每次内部循环结束时,判断flag的值
if (flag == 1)
printf("%d ", n);
}
return 0;
}
- 当前代码只是完成,效率并不高,优化外部for循环代码
- 偶数除了能被1和本身整除,也一定能被2整除,所以偶数不可能会是素数,
- 因此可以不用从100遍历到200,初始从101开始遍历,每次遍历n+=2即可
- 优化内部for循环代码
- k = m*n(k、m、n均为整数)
- 如果一个整数k能写成m*n的形式,那么m或者n其中一个数肯定小于或等于开平方k
- 举例:16 = 2*8 且 16 = 4*4
- 那么16中的2、4、8因子,肯定有小于或等于开平方16的
- 所以判断一个整数n是否为素数,只需要把 2~开平方n 的数试除n,看是否能被整除即可
- sqrt函数 - 开平方函数,此函数的头文件为#include<math.h>
#include<stdio.h>
#include<math.h>
int main()
{
//遍历100~200之间的奇数
for (int n = 101; n <= 200; n+=2)
{
//插旗,用来标记n是否为素数,假设flag为1时,n就是素数
int flag = 1;
//遍历2~开平方n之间的数
for (int j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
{
//当n能被除了1和自身以外的数除净时,此时的n就不是素数,所以将flag置为0
flag = 0;
break;
}
}
//每次内部循环结束时,判断flag的值
if (flag == 1)
printf("%d ", n);
}
return 0;
}