Sito Eratostenesa - prośba o werfikację i omówienie linijek kodu

0

Witam. C# to mój pierwszy język programowania. Uczę się od 2tygodni z tej książki: http://c-sharp.ue.katowice.pl/ksiazka/c_sharp_wer1_1.pdf nie wiem czy jest dobrym źródłem. Mam takowe zadanie w książce:

Napisz program, który podaje, ile jest liczb pierwszych w tablicy 100 elementowej typu int.

Napisałem program za pomocą Sita Eratostenesa wzorując się na przykładzie z sieci.
Wstyd się przyznać ale mam problem z odwoływaniem się do wartości tablicy, tworzeniem pętel .
Proszę o omówienie na przykładzie danej liczby np "10" działanie programu. Napiszę komentarze czego nie rozumiem i proszę się odnieśc do tego. Będę bardzo wdzięczny za pomoc.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zad_4._4
{
    class Program
    {
        static void Main(string[] args)
        {
            //deklaruj zmienne
            int i, j, zakres, pierwiastek;

            //twórz tablice
            int[] tab=new int[100];

            //wczytaj zakres zmiennych
            Console.WriteLine("Podaj gorny zakres, do ktorego chcesz odnalezc liczby pierwsze");
            zakres = int.Parse(Console.ReadLine());
            pierwiastek= (int)Math.Floor(Math.Sqrt(zakres));

            //inicjuj tablice
            for (i = 1; i <= zakres; i++) 
                tab[i] = i;

                        //algorytm - Sito Eratostenesa 
            for (i= 2; i<= pierwiastek; i++)   // Pętla bierze sobię liczbę np "10' i sprawdza czy jest pierwsza. Tylko nie rozumiem jak to działa skoro pierwiastek z 10 wynosi około 3.2.
            {
                {
                    j = i + i;    // Nie rozumiem w jaki sposób ma to wpływać na program
                    while (j <= zakres)
                    {
                        tab[j] = 0; // wartość początkowa indeksów czy elementów?? tablicy ma być przypisana do zera?
                        j += i;  // również nie wiem
                    }
                }
            }
            //wypisz wynik
            Console.WriteLine("Liczby pierwsze z zakresu od 1 do " + zakres);
            for (i = 2; i <= zakres; i++)
                if (tab[i] != 0) // jak usunę tą linie to program wyświetla wszystkie liczby po koleji. Nie wiem dlaczego skoro wszystkie elementy tablicy są różne od zera. Chyba, że chodzi o pierwszy index o wartości 0? (liczba 1)
                    Console.WriteLine(i + ", ");
            Console.ReadKey();
            
        }
    }
}
1

Zacznijmy od tego czy wiesz jak działa sito Eratostenesa ?

"Pętla bierze sobię liczbę np "10' i sprawdza czy jest pierwsza. Tylko nie rozumiem jak to działa skoro pierwiastek z 10 wynosi około 3.2." - nie bierze sobie np 10, tylko bierze kolejne liczby z zakresu od 2 do pierwiastek z zakresu. - zgodnie z założeniem algorytmu

"Nie rozumiem w jaki sposób ma to wpływać na program" - musisz "wykreślić" z tablicy wszystkie wielokrotności liczby i, więc zaczynasz od 2*i (w tym wypadku zapisane jako i+i), a potem kolejne zwiększając zmienną j o i (j += i)

"jak usunę tą linie to program wyświetla wszystkie liczby po kolei. Nie wiem dlaczego skoro wszystkie elementy tablicy są różne od zera. Chyba, że chodzi o pierwszy index o wartości 0? (liczba 1)" - nie są różne od zera. Co prawda na początku wypełniasz w ten sposób tablicę, ale potem w pętli (którą zakomentowałeś jako "algorytm - Sito Eratostenesa ") "wykreślasz" przypisując zero kolejne elementy które nie są liczbami pierwszymi.

PS. Zamiast int[] tab=new int[100]; bezpieczniej było by użyć int[] tab = new int[zakres+1]; po pobraniu zakresu od użytkownika.

0

Dzięki bardzo za szczegółową odpowiedź. Sporo mi rozjaśniłeś. Do tego poczytałem trochę. Spróbuję w wolnym czasie napisać na nowo z wykorzystaniem metody bool. Korzystając z tematu może mi ktoś powiedzieć jak przesunąć index kopiując elementy tab1 do tab2? oraz wrzucic ostatni element tab 1 na pierwsze miejsce tab2? ROzmar ubu tablic ma być taki sam

tab1={0,1,2,3,4,5,6,7,8,9}
Kopiuję do tab2
Wynik programu:
tab1={9,0,1,2,3,4,5,6,7,8}

0

Z takimi rzeczami musisz kombinować sam...

Wyobraź sobie taką sytuację w rzeczywistości.
Masz podłużne pudełko z 10 jajkami na przykład.
Co zrobisz aby uzyskać taki efekt jak pisałeś?
Opisz to sobie słowami a potem spróbuj przełożyć na kod.

0

Wiem wiem, tylko nie wiem czy muszę jakieś metody użyć specjalnej do zmiany indexu czy wystarczy pętla. Ostatnio miałe mniej czasu by się tym zająć. Popróbuję później. Dzięki za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1