题目要求:判断100-200之间的素数。
一.素数定义
素数(质数)是指大于1的自然数,除了1和它本身之外,不能被其他自然数整除。
二.基本算法:试除法
判断一个数n是否为素数,只需检查2到n-i是否有n的因子。
因子:若整数 a / b 能整除、没余数,b 就是 a 的因子(因数)。
本题代码:(分支语句)
#include <stdio.h>
int main()
{
int i = 0;
//遍历100-200之间的所有数字
for (i = 100; i <= 200; i++)
{
//判断i是否是素数?
//产生2到i-1之间的数字。
int flag = 1;//标记素数,1是素数,0不是素数,先假设i是素数。
int j = 0;
//试除法
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ",i);
}
}
return 0;
}
三.优化
优化1:偶数一定不是素数:
for(int i = 100;i < =200;i++) --> for(int i = 101;i <= 200;i +=2)。
优化2:只需检查根号n。--> 用sqrt(平方根)函数,需要调用头文件<math.h>。
因为如果n有因子,至少有一个因子≤√n。否则两个因子都大于√n,乘积就会大于n,矛盾。
代码:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
for (i = 101; i <= 200; i += 2)//偶数一定不是素数
{
//判断i是否是素数?
//产生2到i-1之间的数字。
int flag = 1;//假设i是素数
int j = 0;
//sqrt是计算平方根 --> 要调用头文件<math.h>
for (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 IsPrime(int n)//判断素数
{
int j = 0;
int flag = 1;//假设i是素数
//试除
for (j = 2; j < sqrt(n); j++)
{
if (n % j == 0)
{
return 0;//不是素数,返回0。
}
}
return 1;//是素数,返回1。
}
int main()
{
//遍历所有待查数字。
for (int i = 101; i <= 200; i+= 2)
{
int ret = IsPrime(i);//调用函数
//打印结果
if (ret == 1)
{
printf("%d是素数\n",i);
}
}
return 0;
}
结果:
