IEnumerable which returns Prime Numbers: 最小的实现
IEnumerable which returns Prime Numbers: smallest implementation
最近我想知道什么是 IEumerable 的最小实现,其中 returns 给定数量的素数。它应该适合这个程序:
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;
}
我的尝试是这样的:
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
所有质数。
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;
}
}
}
另一个最小的 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);
}
最近我想知道什么是 IEumerable 的最小实现,其中 returns 给定数量的素数。它应该适合这个程序:
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;
}
我的尝试是这样的:
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
所有质数。
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;
}
}
}
另一个最小的 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);
}