/ / Problemy z pętlami w programie, aby znaleźć liczby pierwsze - c #, pętle, aplikacja konsoli, zagnieżdżone pętle

Kłopoty z pętlami w programie do znajdowania liczb pierwszych - c #, pętli, aplikacji konsolowych, pętli zagnieżdżonych

Cześć. Mam problem z ustaleniem sposobużeby to zadziałało. Jego przeznaczony do znalezienia pierwszej liczby x liczb pierwszych za pomocą danych wejściowych użytkownika w celu ustawienia x. Następnie umieści dowolną tablicę przed wydrukowaniem wyników. Wydaje mi się, że zrobiłem problem z pętlami, ponieważ po wprowadzeniu danych wejściowych nic się nie stanie. Byłbym wdzięczny, gdyby ktoś mógł wskazać, gdzie popełniłem błąd, i przekazać sugestie, jak to naprawić. Dzięki

static void Main(string[] args)
{
int max, i, count;
i = 0; // this is used to keep trck of how many primes have been added to the array
count = 0; // this is used to test each number
Console.WriteLine("This will work out the first x prime numbers with x being the number of prime numbers you want");
Console.WriteLine("Enter the number of prime numbers you want.");
max = Convert.ToInt32(Console.ReadLine());

int[] primes = new int[max];

while (i <= max)
{
while (count <= 9999)
{
if (count % 2 == 0 || count % 3 == 0 || count % 5 == 0 || count % 7 == 0 ) // tests if count number is a prime
{
if (count == 2 || count == 3 ||count == 5 ||count == 7 ) // ensures 2,3,5,7 are added to primes if neccesarry
{

primes[count] = count; //add to array
i++; // increments the count on the number of prime numbers
}
count ++; // increments the count
break;
}
else
{
primes[count] = count;
i++;
count ++;
}
}
}

Console.WriteLine("The first {0} prime numbers are ... ", max);
foreach(var item in primes)
{
Console.Write(item.ToString() + ", ");
}
}

Odpowiedzi:

0 dla odpowiedzi № 1

W duchu starania się zachować oryginalny kod, oto zmodyfikowane podejście do twojego algorytmu, zmodyfikowane do użycia Sito Eratostenesa:

  • Sito może iteracyjnie określać wszystkie liczby pierwsze, mając jedynie świadomość, że 2 jest liczbą pierwszą.
  • Warunkiem wyjścia w wewnętrznej pętli powinno być przekroczenie pierwiastka kwadratowego z liczby, którą testujemy, z naszą listą znanych liczb pierwszych (nie 9999 i break). Ze względu na definicję liczby pierwszej, z listą liczb pierwszych do X, możemy rozwiązać wszystkie inne liczby pierwsze do X * X. (Więc możemy przerwać testowanie, jeśli przekroczymy pierwiastek kwadratowy, np. 2 może rozwiązać 3 i 4, 2 i 3 mogą rozwiązać do 9 itd.). Jest tak również dlatego, że nasze liczby pierwsze są już uporządkowane w kolejności rosnącej.
  • Zachowałem oryginalne zmienne, tj. count jest kolejnym sprawdzonym kandydatem na pierwsze stanowisko, i jest bieżącym indeksem liczby pierwszej, max jest górna granica, aby wypełnić.
  • Pierwsza liczba pierwsza, 2, musi być zakodowana na stałe (tj. primes[0] = 2, następny indeks główny i będzie wynosić 1, a pierwszym numerem kandydata, który będziemy musieli sprawdzić, będzie 3.

// We do need to hard code that 2 is a prime number. Everything else can be derived
primes[0] = 2;
i = 1;
count = 3;

// i.e. stop when we get the required number of primes
while (i < max)
{
// Indicator to stop testing this candidate if we find a factor
bool foundFactor = false;
// Start off each primality test from the start of our primes array
var primeIndex = 0;

// Try and find a factor of "count" with our known primes
while (!foundFactor && primeIndex < i)
{
// We can stop after the square root. Multiplication is faster than sqrt
if (primes[primeIndex]*primes[primeIndex] > count)
break;
// If the candidate number
if (count % primes[primeIndex] == 0)
foundFactor = true;
primeIndex++;
}
if (!foundFactor)
{
primes[i] = count;
i++;
}

count++;
}

Zgodnie z linkiem @Massimo powyższy mechanizm brutalnej siły jest strasznie nieefektywny. Ulepszeniem jest „koło 6” wymienione w artykule na Wiki - po count=6, koło 6 bierze każdy zestaw liczb kandydujących do przetestowania w seriach po 6, a wszystkie wielokrotności 2 i 3 można natychmiast wyeliminować. Możliwe są również inne większe koła.


1 dla odpowiedzi nr 2

Po pierwsze, nie jest to sposób na sprawdzenie, czy liczba jest liczbą pierwszą, ale z drugiej strony cykl jest nieprawidłowy.

Jeśli umieścisz maksimum, które jest wyższe niż liczba liczb pierwszych mniejsza niż 9999, będzie ono wiecznie przełączać się w pętli zewnętrznej.

Sprawdź wiki, aby uzyskać pierwsze informacje: http://en.wikipedia.org/wiki/Primality_test

Aby sprawdzić moje zdanie, możesz dodać dane wyjściowe konsoli w zewnętrznej pętli i przekonać się sam