一、题目
描述
输入M、N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数。素数定义:除了1以外,只能被1和自己整除的自然数称为素数
输入描述:
两个整数M,N
输出描述:
区间内素数的个数
示例1
输入:
2 10
复制输出:
4
二、结论
若n为素数,则 2~sqrt(n)之间所有数字一定不会被n整除。
三、代码
#include <math.h>
#include <stdio.h>
int main() {
int a = 0, b = 0;
scanf("%d %d", &a, &b);
getchar();
int count = 0;
for (int i = a; i <= b; i++)
{
int k = 0;
int flag = 0;
for (k = 2; k <= (int)sqrt(i) ;k++)
{
if(i % k == 0) //如果能整除,说明不是素数
{
flag = 1;
break;
}
}
if (flag == 0)
count++;
}
printf("%d\n", count);
return 0;
}
四、讲解
for (int i = a; i <= b; i++)
{
int k = 0;
int flag = 0;
for (k = 2; k <= (int)sqrt(i) ;k++)
{
if(i % k == 0) //如果能整除,说明不是素数
{
flag = 1;
break;
}
}
if (flag == 0)
count++;
}
1.默认为素数,
当flag == 1,则不为素数。
2.
double sqrt (double x);
最好将数据类型强制转化为 int
3.为了追求时间复杂度,没必要将 2~n所有数据都试除,只需要将 2~sqrt(n)的所有数据试除就好。
五、注意点:
flag需要封装在循环内部