Created
May 19, 2017 08:40
-
-
Save andreisfedotov/ec4f5edc5d915d63e620f71e7244d96c to your computer and use it in GitHub Desktop.
Этот класс генерирует простые числа, не превышающие заданного пользователем порога. В качестве алгоритма используется решето Эратосфена.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///<remark> | |
/// Этот класс генерирует простые числа, не превышающие заданного | |
/// пользователем порога. В качестве алгоритма используется решето | |
/// Эратосфена. | |
/// Пусть дан массив целых чисел, начинающийся с 2: | |
/// Находим первое невычеркнутое число и вычеркиваем все его | |
/// кратные. Повторяем, пока в массиве не останется кратных. | |
///</remark> | |
using System; | |
public class PrimeGenerator | |
{ | |
private static int s; | |
private static bool[] f; | |
private static int[] primes; | |
public static int[] GeneratePrimeNumbers(int maxValue) | |
{ | |
if (maxValue < 2) | |
return new int[0]; | |
else | |
{ | |
InitializeSieve(maxValue); | |
Sieve(); | |
LoadPrimes(); | |
return primes; // вернуть простые числа | |
} | |
} | |
private static void LoadPrimes() | |
{ | |
int i; | |
int j; | |
// сколько оказалось простых чисел? | |
int count = 0; | |
for (i = 0; i < s; i++) | |
{ | |
if (f[i]) | |
count++; // увеличить счетчик | |
} | |
primes = new int[count]; | |
// поместить простые числа в результирующий массив | |
for (i = 0, j = 0; i < s; i++) | |
{ | |
if (f[i]) // если простое | |
primes[j++] = i; | |
} | |
} | |
private static void Sieve() | |
{ | |
int i; | |
int j; | |
for (i = 2; i < Math.Sqrt(s) + 1; i++) | |
{ | |
if (f[i]) // если i не вычеркнуто, вычеркнуть его кратные. | |
{ | |
for (j = 2 * i; j < s; j += i) | |
f[j] = false; // кратное – не простое число | |
} | |
} | |
} | |
private static void InitializeSieve(int maxValue) | |
{ | |
// объявления | |
s = maxValue + 1; // размер массива | |
f = new bool[s]; | |
int i; | |
// инициализировать элементы массива значением true. | |
for (i = 0; i < s; i++) | |
f[i] = true; | |
// исключить заведомо не простые числа | |
f[0] = f[1] = false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment