2015-05-19 42 views
-1

最近我想知道什麼可能是最小的IEumerable實現返回給定數量的素數。它應該適合在這個程序:IEnumerable返回素數:最小實現

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; 
} 
+0

@vtortola感謝非常有趣的環節。這也是關於IEnumerables和迭代器,使用Primes只是一個算法示例 – DrKoch

+0

在「最小實現」下你是什麼意思?這是最小的字符數量嗎?這裏沒有考慮效率嗎? –

+0

@OleksandrPshenychnyy讓我們說合理格式的,可​​讀的和可理解的代碼的行數,不包括註釋 – DrKoch

回答

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); 
} 
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; 
} 

這是一個迭代器yield returns的所有質數。

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; 
     } 
    } 
}