Program wyszukujący liczby pierwsze z podanego zakresu

0

Witam muszę stworzyć program który posiada dwie klasy. Pierwsza z nich szuka liczb pierwszych z zakresu do n i wie jaki jest ich numer w tablicy. 2 klasa wypisuje to w ten sposób: jesli napisze java Program 14 3 5 9 to pierwszy argument jest zakresem a reszta zostaje wypisana w taki sposób 3-1, 5-2, 11-4. tzn 2 to 0 w tablicy, 3 to 1 w tablicy itp a jeśli bym podał załóżmy 17 to ma wyskoczyć ze nie mieści się w zakresie. I stworzyłem coś takiego:

public class LiczbyPierwsze
{
   public LiczbyPierwsze(int n)
   {
      public static void main(String args[])
      {
         int tablica[]= new int[10000];
         for(int i=1; i<=n; i++)
         {
            if(tablica[i]!=0)
            {
               j=i+i;
               while(j<=n)
               {
                  tablica[j]=0;
                  j+=i;
               }
            }
         }
      }
   }
   public static int liczba(int m)
   {
      for(m=0; m<args.length; m++)
      {
         return args[m];
      }
   }
}
public class Test
{
   public static void main(String[] args)
   {
      for(int m=0; z<args.length; m++)
      {
         System.out.print(m);
         System.out.print(" "+ LiczbyPierwsze(n);
         System.out.println();
      }
   }
}

I nie wiem czy w ogóle dobrze myśle. Pozdrawiam :)

0

Jest coś takiego jak code, w edytorze postów dodaj to bo tego kodu nie da się czytać :(

0
Nieposkromiony Lew napisał(a):

Jest coś takiego jak code, w edytorze postów dodaj to bo tego kodu nie da się czytać :(

Done

0

Teraz zrobiłem coś takiego ale Program nawet nie chce się odpalić dlaczego?


public class LiczbyPierwsze
{
   public LiczbyPierwsze(int n)
   {
      public static void main(String args[])
      {
         for(int i=1; i<=n; i++)
         {
            if(args[i]!=0)
            {
               j=i+i;
               while(j<=n)
               {
                  args[j]=0;
                  j+=i;
               }
            }
         }
      }
   }
   public static void int liczba(int m)
   {
      for(m=0; m<args.length; m++)
      {
         return args[m];
      }
   }
}
public class Test extends LiczbyPierwsze
{
   public static void main(String[] args)
   {
      for(int m=0; m<args.length; m++)
      {
         int n;
         System.out.print(args[m]);
         System.out.print(" "+ LiczbyPierwsze(n));
         System.out.println();
      }
   }
}
1
public LiczbyPierwsze(int n)

To jest konstruktor, w nim nie powinno być metody main.

public static void int liczba(int m)
   {
      for(m=0; m<args.length; m++)
      {
         return args[m];
      }
   }

Ta funkcja nie potrzebnie wymaga parametru m dlatego że i tak jest ustawiany na 0 w pętli for. Pętla ta wykona się tylko raz bo od razu zwróci args[0].

public static void int liczba(int m)

Metoda musi zwracać albo void albo int - nie może być obu.

0

Ogólnie zacząłem od początku i stworzyłem tylko klasę i w niej dwie funkcje(które miałem w poleceniu) jedna tworzy tablice liczb pierwszych do n a druga zwraca wartosc m-tej liczby w tablicy:
public class LiczbyPierwsze

{
   public LiczbyPierwsze(int n)
   {
      int tab[]=new int[n+1];
      for(i=0; i<=n; i++)
      {
         tab[i]=true;
      }
      tab[1]=false;
      for(int i=2; i<=sqrt(n); i++)
      {
         if(tab[i]==true)
         {
            for(int j=i+i; j<=n; j=j+1)
            {
               tab[j]=false;
            }
         }
      }
   }
   public static int Liczba(int m)
   {
      m=tab.length
      for(i=0; i<=m; i++)
      {
         return tab[m];
      }   
   }
}

public class Test      
{
   public static void main( String[] args)     

Dobrze to jest?

0

Nie.

To:

int tab[]=new int[n+1];
for(i=0; i<=n; i++)
{
    tab[i]=true;
}
tab[1]=false;
for(int i=2; i<=sqrt(n); i++)
{
    if(tab[i]==true)
    {
        for(int j=i+i; j<=n; j=j+1)
        {
            tab[j]=false;
        }
    }
}

Nie powinno być w konstruktorze a w metodzie.

for(i=0; i<=n; i++)

i jest niezadeklarowane

tab[i]=true;

tab jest tablicą int a nie boolean.

W metodzie Liczba(int m) zmienna tab nie istnieje więc nie możesz zrobić tab.length.

0

To mam to robić całkowicie od nowa jeśli użyłem wartosci true i false i robic "zwykłe" sito które znaleźć można w internecie?

0
atmal napisał(a):

Nie.

To:

int tab[]=new int[n+1];
for(i=0; i<=n; i++)
{
    tab[i]=true;
}
tab[1]=false;
for(int i=2; i<=sqrt(n); i++)
{
    if(tab[i]==true)
    {
        for(int j=i+i; j<=n; j=j+1)
        {
            tab[j]=false;
        }
    }
}

Nie powinno być w konstruktorze a w metodzie.

for(i=0; i<=n; i++)

i jest niezadeklarowane

tab[i]=true;

tab jest tablicą int a nie boolean.

W metodzie Liczba(int m) zmienna tab nie istnieje więc nie możesz zrobić tab.length.

a poza tym mam takie polecenie: 1 Stwórz publiczn¡ klas¦ LiczbyPierwsze posiadaj¡c¡ jeden konstruktor LiczbyPierwsze(int
n), który tworzy tablic¦ liczb pierwszych znajduj¡cych si¦ w zakresie od 2 do n. Nast¦pnie
zaimplementuj publiczn¡ metod¦ int liczba(int m) zwracaj¡c¡ warto±¢ m-tej liczby pierwszej
z tego zakresu. Funkcja ta powinna prawidªowo dziaªa¢ dla liczb od 0 do k, gdzie k to
ilo±¢ liczb pierwszych w zakresie od 2 do n.
więc oni tak jakby nakazują mi robienie tablicy w konstruktorze a nie w metodzie :( nie kumam..

0

Ma to wyglądać tak:

public class LiczbyPierwsze {
	private int[] liczby; // Ta tablica będzie dostępna dla wszystkich metod w tej klasie
	
	public LiczbyPierwsze(int n) {
		liczby = new int[n + 1];
		// Zapełnij tablicę liczby kolejnymi liczbami pierwszymi
	}

	public int liczba(int m) {
		return liczby[m];
	}
}
0
atmal napisał(a):

Ma to wyglądać tak:

public class LiczbyPierwsze {
	private int[] liczby; // Ta tablica będzie dostępna dla wszystkich metod w tej klasie
	
	public LiczbyPierwsze(int n) {
		liczby = new int[n + 1];
		// Zapełnij tablicę liczby kolejnymi liczbami pierwszymi
	}

	public int liczba(int m) {
		return liczby[m];
	}
}

Czyli mam zapełniać tą tablice w bez typu boolowskiego?

0

Zgadza się, w tej tablicy mają być liczby:
2, 3, 5, 7, 11, 13, 17, 19... n

0
atmal napisał(a):

Zgadza się, w tej tablicy mają być liczby:
2, 3, 5, 7, 11, 13, 17, 19... n


public class LiczbyPierwsze
{
private int[] liczby;
public LiczbyPierwsze(int n)
{
liczby = new int[n+1];
int i,j,z;
z=sqrt(n);
for(i=1; i<=n; i++)
{
liczby[i]=i;
}
for(i=2; i<=z; i++)
{
if(liczby[i]!=0)
{
j=i+i;
while(j<=n)
{
liczby[j]=0;
j+=i;
}
}
}
}
public static int Liczba(int m)
{
return liczby[m];
}
}

public class Test
{
public static void main( String[] args)
tak?

0

Metoda Liczba(int m) nie może być statyczna.

Poza tym twój algorytm działa nieprawidłowo, tablica powinna wyglądać tak:

liczby[0] = 2
liczby[1] = 3
liczby[2] = 5
liczby[3] = 7
...
0
atmal napisał(a):

Metoda Liczba(int m) nie może być statyczna.

Poza tym twój algorytm działa nieprawidłowo, tablica powinna wyglądać tak:

liczby[0] = 2
liczby[1] = 3
liczby[2] = 5
liczby[3] = 7
...

A co tak naprawdę robi moja funkcja? Myślałem ze robi to tak samo a chyba działa jak tryb boolowski..prawda?

0

Na pewno nie robi tego co powinna :P
Po uruchomieniu:

public static void main(String[] args) {
    LiczbyPierwsze pierwsze = new LiczbyPierwsze(20);
    System.out.println(pierwsze.Liczba(7));
}

Tablica liczby wygląda tak:

liczby[0] = 0
liczby[1] = 1
liczby[2] = 2
liczby[3] = 3
liczby[4] = 0
...
liczby[n] = 0
0
atmal napisał(a):

Na pewno nie robi tego co powinna :P
Po uruchomieniu:

public static void main(String[] args) {
    LiczbyPierwsze pierwsze = new LiczbyPierwsze(20);
    System.out.println(pierwsze.Liczba(7));
}

Tablica liczby wygląda tak:

liczby[0] = 0
liczby[1] = 1
liczby[2] = 2
liczby[3] = 3
liczby[4] = 0
...
liczby[n] = 0

Zauważyłem, że zapisałem liczby[i]=i a powinno byc chyba liczby[i]=1. A poza tym jak Pan to odpalił skoro mi wyskakują jakieś błędy :(

0
Michas12 napisał(a):
atmal napisał(a):

Na pewno nie robi tego co powinna :P
Po uruchomieniu:

public static void main(String[] args) {
    LiczbyPierwsze pierwsze = new LiczbyPierwsze(20);
    System.out.println(pierwsze.Liczba(7));
}

Tablica liczby wygląda tak:

liczby[0] = 0
liczby[1] = 1
liczby[2] = 2
liczby[3] = 3
liczby[4] = 0
...
liczby[n] = 0

Zauważyłem, że zapisałem liczby[i]=i a powinno byc chyba liczby[i]=1. A poza tym jak Pan to odpalił skoro mi wyskakują jakieś błędy :(

Ale to i tak bez sensu bo wyskakuje tylko ze jest albo 1 albo 0 :/

0

W internecie nie używa się Pan/Pani ;)

Parę rzeczy dodałem/zmieniłem więc udało się uruchomić.
Zmiana liczby[i] = i na liczby[i] = 1 nic tutaj nie da.

Zrób tak: napisz osobną metodę prywatną w klasie LiczbyPierwsze która będzie zwracała true w gdy liczba jest pierwsza a w przeciwnym razie false.

// Algorytm ten można usprawnić - jeżeli chcesz to znajdziesz wskazówki na internecie
private boolean isPrime(int n) {
	if (n < 2)
		return false;

	for (int i = 2; i < n; i++) {
		if (n % i == 0)
			return false;
	}
	
	return true;
}

Następnie, w konstruktorze:

public LiczbyPierwsze(int n) {
	liczby = new int[n]; // n jest wystarczającym rozmiarem
	
	int index = 0;
	for (int i = 2; i < n; i++)
	{
		if (isPrime(i)) // Jeżeli liczba jest pierwsza
			liczby[index++] = i; // Dodaj ją do tablicy i zinkrementuj index
	}
}

Po stworzeniu obiektu typu LiczbaPierwsza będziesz miał zapełnioną tablicę liczby tak jak napisałem kilka postów wyżej.

0
public class LiczbyPierwsze
{
   private boolean isPrime(int n)
   {
      if (n < 2)
      {
         return false;
      }
      for (int i = 2; i < n; i++)
      {
         if (n % i == 0)
         {   
            return false;
         }
      }
   return true;
   }

   public LiczbyPierwsze(int n) 
   {
      liczby = new int[n];
      int index = 0;
      for (int i = 2; i < n; i++)
      {
         if (isPrime(i))
         {
            liczby[index++] = i; 
         }
      }
   }
   
   public int liczba(int m)
   {
      return liczby[m];
   }
}

tak?

0

Nie masz IDE że tak pytasz?

Brakuje Ci deklaracji tablicy liczby (pominąłem kod w metodach):

public class LiczbyPierwsze {
	private int[] liczby; // <--- Deklaracja tablicy

	public LiczbyPierwsze(int n) { ... } // Tutaj definicja czyli liczby = new int[n]
	private boolean isPrime(int n) { ... }
	public int Liczba(int m) { ... }
}
0
atmal napisał(a):

Nie masz IDE że tak pytasz?

Brakuje Ci deklaracji tablicy liczby (pominąłem kod w metodach):

public class LiczbyPierwsze {
	private int[] liczby; // <--- Deklaracja tablicy

	public LiczbyPierwsze(int n) { ... } // Tutaj definicja czyli liczby = new int[n]
	private boolean isPrime(int n) { ... }
	public int Liczba { ... }
}

No ok, mam to. I teraz muszę stworzyc klasę Test której metoda statyczna main dla pierwszego argumentu wywoªania stworzy
tablic¦ liczb pierwszych a nast¦pnie dla kolejnych argumentów wypisze warto±ci liczb
pierwszych znajduj¡cych si¦ na poszczególnych pozycjach tablicy.
W przypadku bª¦dnego pierwszego argumentu program wypisze komunikat bª¦du i sko«czy. No i nie wiem jak program ma odróżnić ze pierwszy argument to n a drugi to liczby pierwsze..

0

Proste.
args[0] sprawdzasz czy jest poprawne, jeżeli nie to wychodzisz z programu (np. używając return).
Jeżeli args[0] jest poprawne to tworzysz nowy obiekt typu LiczbyPierwsze i przekazujesz do konstruktora args[0].

Następnie używając pętli od 1 do args.length wywołujesz metodę Liczba() używając obiekt który utworzyłeś a wynik wyświetlasz za pomocą System.out.println().

BTW - Nie ma potrzeby cytowania postu jeżeli odpowiadasz zaraz pod nim ;)

0

Wiem, że może to głupie pytanie i już masz mnie dosyc tylko kurde nie mam pojęcia jak przekazać obiekt do konstruktora..Nie miałem na wykładach nic jeszcze o tym powiedziane :/

0

Musisz pamiętać o tym że args to tablica String, aby przerobić String na int możesz użyć Integer.parseInt().
Dla przykładu:

int n = Integer.parseInt(args[0]); // Konwertuje args[0] z String na int
if (n < 2)
{
	System.out.println("Błąd: Maksymalna liczba pierwsza musi być większa niż 2");
	return;
}
LiczbyPierwsze pierwsze = new LiczbyPierwsze(n); // Tworzy nowy obiekt, n przekazane jest do konstruktora
0

```public class LiczbyPierwsze
{
   private int[] liczby;

   public LiczbyPierwsze(int n) 
   {
      liczby = new int[n];
      int index = 0;
      for (int i = 2; i < n; i++)
      {
         if (isPrime(i))
         {
            liczby[index++] = i; 
         }
      }
   }
   
   private boolean isPrime(int n)
   {
      if (n < 2)
      {
         return false;
      }
      for (int i = 2; i < n; i++)
      {
         if (n % i == 0)
         {   
            return false;
         }
      }
   return true;
   }

   public int liczba(int m)
   {
      return liczby[m];
   }
}

public class Test
{
   public static void main(String[] argss)
   {
      int n=Integer.parseInt(args[0]);
      if(n<2)
      {
         System.out.print(args[0]);
         System.out.print(" - "+"Nieprawidłowy zakres");
      }
      else
      {
         LiczbyPierwsze pierwsze= new LiczbyPierwsze(n);
         for(int i=0; i<args.length; i++)
         {
            System.out.print(Liczba(i));
            System.out.print(" "+i);
            System.out.println();
         }
       }
    }
}
Niestety wyskakuje 5 błędów..
0
  1. Masz argss zamiast args w public static void main().
  2. Liczba(i) - nie ma takiej metody, za to obiekt pierwsze ma metodę liczba, musisz zrobić pierwsze.liczba(i).
  3. Do liczba musisz przekazać i-ty argument z linii poleceń a nie i - czyli zamiast pierwsze.liczba(i) ma być pierwsze.liczba(args[i]).
  4. Pętla for musi zaczynać się od 1 ponieważ pierwszy argument to zakres liczb pierwszych (n).
0

```public class LiczbyPierwsze
{
   private int[] liczby;

   public LiczbyPierwsze(int n) 
   {
      liczby = new int[n];
      int index = 0;
      for (int i = 2; i < n; i++)
      {
         if (isPrime(i))
         {
            liczby[index++] = i; 
         }
      }
   }
   
   private boolean isPrime(int n)
   {
      if (n < 2)
      {
         return false;
      }
      for (int i = 2; i < n; i++)
      {
         if (n % i == 0)
         {   
            return false;
         }
      }
   return true;
   }

   public int liczba(int m)
   {
      return liczby[m];
   }
}

public class Test
{
   public static void main(String[] args)
   {
      int n=Integer.parseInt(args[0]);
      if(n<2)
      {
         System.out.print(args[0]);
         System.out.print(" - "+"Nieprawidłowy zakres");
      }
      else
      {
         LiczbyPierwsze pierwsze= new LiczbyPierwsze(n);
         for(int i=1; i<args.length; i++)
         {
            System.out.print(pierwsze.liczba(args[i]));
            System.out.print(" "+i);
            System.out.println();
         }
       }
    }
} 

Wyskakuje mi błąd, że Test.java:1: error: class LiczbyPierwsze is public, should be declared in a file named LiczbyPierwsze.java
public class LiczbyPierwsze
       ^
Test.java:55: error: incompatible types: String cannot be converted to int
            System.out.print(pierwsze.liczba(args[i]));
                                                 ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
2 errors
no I nie wiem czy w public class Test mam zamienic n na Itegera z args[i]? i czemu mi wyskakuje bład z tą klasa publiczną?
0

I jedno pytanko ciężko będzie ten program przerobić na C++? bo mam tak w poleceniu a w C++ nigdy się nie bawiłem..

0

Jeżeli ta klasa jest publiczna musi być w osobnym pliku o tej samej nazwie.

Zapomniałem o konwertowaniu na int - musi być pierwsze.liczba(Integer.parseInt(args[i])).

Nie znasz C++ więc może być ciężko przepisać.

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