C# 代码如下:
- 两层 for 循环, 第一层时间复杂度 O ( n ) O(n) O(n), 第二层时间复杂度 O ( n ) O(\sqrt{n}) O(n).
- 总的时间复杂度为 O ( n 1.5 ) O(n^{1.5}) O(n1.5).
- 内部会存放找到的素数, 因此空间复杂度为素数的渐进估计: O ( n / l o g n ) O(n/ log { n}) O(n/logn).
/// <summary>
/// 返回所有小于等于 limit 的素数.
/// </summary>
/// <param name="limit">上限.</param>
/// <returns>所有小于等于 limit 的素数的序列.</returns>
public static IEnumerable<int> GetPrimesByLimit(int limit)
{
List<int> primes = [2];
if(limit >= 2)
{
yield return 2;
}
for (int i = 3; i <= limit; i += 2)
{
foreach ( int p in primes)
{
if (i % p == 0)
{
break;
}
if(p * p > i)
{
primes.Add(i);
yield return i;
break;
}
}
}
}
在笔记本电脑上, 计算10万以内的素数用时 11.08ms.
计算 100万以内的素数用时 212.15ms
计算 1000万以内的素数用时 3912.10ms