题目描述
解题
暴力解法(枚举)
遍历到n的所有正整数,对比自己小的所有的数求余,有一个余数为0,则为合数;
static int CountPrimes(int n)
{
if (n <= 1) return 0;
int nums = 0;
int flag = 1;
for (int i = 2; i < n; i++)
{
flag = 1;
for (int j = 2; j * j <= i && flag == 1; j++)
{
if (i % j == 0)
{
flag = 2;
}
}
if (flag == 1) nums++;
}
return nums;
}
优化部分:
①flag标志作用为一旦有余数为0情况跳出当前循环,可改用一个返回值为bool的函数来完成
②除数循不用遍历到被除数位置,j * j <= i
厄拉多塞筛法
图解厄拉多塞筛法:
PS:如果一个数是质数,那这个数的所有倍数都为合数。
static int CountPrimes(int n)
{
bool[] sums = new bool[n];
int count = 0;
for (int i = 2; i < n; i++)
{
if (sums[i])
{
count ++;
for (int j = i + i; j < n; j += i)
{
sums[j] = true;
}
}
}
return count;
}