IEnumerable返回Prime数字:最小的实现

时间:2015-05-19 12:50:26

标签: c# ienumerable

最近我想知道什么是IEumerable的最小实现,它返回给定数量的素数。它应该适合这个程序:

static int Main(string[] args)
{
    while(true)
    {
        Console.WriteLine("How many Primes?");
        string line = Console.ReadLine();
        if (line.Trim() == "") break;

        int numPrimes;
        if(!int.TryParse(line.Trim(), out numPrimes)) continue;

        int i = 1;
        foreach(int p in PrimeNumbers(numPrimes))
        {
            Console.WriteLine("{0}: {1}", i++, p);                    
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

我的尝试看起来像这样:

static IEnumerable<int> PrimeNumbers(int numPrimes)
{
    yield return 2; // first prime number
    for(int n=1, p = 3; n < numPrimes; p+=2)
    {
        if (!checkIfPrime(p)) continue;                                
        n++;
        yield return p;              
    }
}

// p > 2, odd
private static bool checkIfPrime(int p)
{
    for (int t = 3; t <= Math.Sqrt(p); t += 2)
    {
        if (p % t == 0) return false;              
    }
    return true;
}

Iterator yield returns所有素数。

答案 1 :(得分:1)

public static IEnumerable<int> PrimeNumbers(int NumberPrimes)
{
    yield return 2;
    for (int i = 3; i < NumberPrimes; i = i + 2)
    {
        bool IsPrime = true;
        System.Threading.Tasks.Parallel.For(2, i, (o, state) =>
        {
            if (i % o == 0)
            {
                IsPrime = false;
                state.Break();
            }
        });
        if (IsPrime)
        {
            yield return i;
        }
    }
}

答案 2 :(得分:1)

最小的C#程序的另一个例子:

static IEnumerable<int> PrimeNumbers(int n)
{
    return Enumerable.Range(2, int.MaxValue - 2)
                     .Where(i => ParallelEnumerable.Range(2, Math.Max(0, (int)Math.Sqrt(i) - 1))
                                                   .All(j => i % j != 0))
                     .Take(n);
}