Sprawdzanie czy Pierwsza - jak rozbudować kod, by działał dla więcej niż jednej liczby?

0

Mam taki kod:

public class czyPierwsza{

    public static boolean czyPierwsza(boolean x, int n) {
        int p = 2;

        while (p<n) {
            if (p == n) {
            x = true;
            return x;
        }
            else if (n%p==0) {
            x = false;
            return x;
        }
        ++p;
        return true;
        }
        x = false;
        return x;
    }

    public static void main(String[] args) {
        int n = 1;

        boolean x = false;

        czyPierwsza(x, n);
        if (x == true) { 
            System.out.println("Liczba " + n + " jest liczbą pierwszą.");
            }
        else System.out.println("Liczba " + n + " nie jest liczbą pierwszą.");

        }
    }

Jak mogę go zmienić, by obsługiwał nie tylko podaną n=1, ale np. liczby od 1 do 20? Domyślam się, że muszę wykorzystać albo pętlę, albo tablice, ale mam problem z wykonaniem tego.

1
for(i=1; i<=20;i++){
  if(czyPierwsza(x,i)) System.out.println("Liczba " + n + " jest liczbą pierwszą.");
else  System.out.println("Liczba " + n + " nie jest liczbą pierwszą.");
}
0

Zamiast obsługiwać tylko 200 liczb zrób wprowadzanie liczby od użytkownika i sprawdzaj czy pierwsza.

Scanner inputValue = new Scanner(System.in);

System.out.println("Podaj liczbe: ");
int val = inputValue.nextInt();
1

Trochę uprościłem Ci funkcję testującą, po co to x? Możesz też uźyć listy

import java.lang.Math;
import java.util.*;

class Main {
  public static boolean isPrime(int n)
    {
      if (n % 2 == 0)
        return false;
      int ind;
      for (ind = 3; ind <= Math.sqrt(n) + 1; ind += 2){
        if (n % ind == 0)
          return false;
      }
      return true;
    }
    public static void main(String[] args) {
    System.out.println(isPrime(137)); // true, sanity check:)
    List<Integer> ints_list = new ArrayList<Integer>();
    ints_list.add(456);
    ints_list.add(137);
    for (Integer x: ints_list)
    {
      System.out.println(isPrime(x));
    }   
}
1

Cały kod jest do poprawy:
Po pierwsze to zmienna x w czyPierwsza i main to 2 różne zmienne, dlatego przypisanie wartości do x w metodzie czyPierwsza nie zmieni wartości x w metodzie main.

Algorytm sprawdzania czy liczba jest pierwsza jest zupełnie zły, zobacz to https://pl.wikipedia.org/wiki/Sito_Eratostenesa

Dodanie bezwarunkowego return w pętli mija się z celem, bo to przewie pętlę.

Raczej nie powinieneś nazywać metody tak samo jak klasę

0

@kamil: "Algorytm sprawdzania czy liczba jest pierwsza jest zupełnie zły, zobacz to https://pl.wikipedia.org/wiki/Sito_Eratostenesa". Sito Erastotenesa służy do generowania tablicy liczb pierwszych, a nie do sprawdzania czy liczba jest pierwsza. O testach, na liczbę pierwszą, na przykład, tutaj: https://4programmers.net/Mikroblogi/primes, a trochę ulepszone, naiwne algorytmy tutaj: https://4programmers.net/Foru[...]sze_pomoc?p=1385819#id1385819

0

Dzięki wszystkim za pomoc.
Pętlę wstawiłem we właściwe miejsce, wyświetlam teraz kilka liczb z danego przedziału.
Poprawiłem też kod według sugestii @lion137, ale wyniki nie są takie, jakie być powinny. Gdzie mam błąd? :/

public class czyPierwsza{

    public static boolean czyPierwsza(int n) {
            if (n < 2) return false;
            if (n == 2) return true;
            int ind;
              for (ind = 3; ind <= Math.sqrt(n) + 1; ind += 2){
                if (n % ind == 0) return false;
              }
        return true;
        }

    public static void main(String[] args) {
        int n = 1;  

        for(n = 0; n<20; n++) {
        if (czyPierwsza(n)) {
            System.out.println("Liczba " + n + " jest liczbą pierwszą.");
            }
        else System.out.println("Liczba " + n + " nie jest liczbą pierwszą.");
        }
    }
    }

Wychodzi:

Liczba 0 nie jest liczbą pierwszą.
Liczba 1 nie jest liczbą pierwszą.
Liczba 2 jest liczbą pierwszą.
Liczba 3 jest liczbą pierwszą.
Liczba 4 jest liczbą pierwszą.
Liczba 5 jest liczbą pierwszą.
Liczba 6 nie jest liczbą pierwszą.
Liczba 7 jest liczbą pierwszą.
Liczba 8 jest liczbą pierwszą.
Liczba 9 nie jest liczbą pierwszą.
Liczba 10 jest liczbą pierwszą.
Liczba 11 jest liczbą pierwszą.
Liczba 12 nie jest liczbą pierwszą.
Liczba 13 jest liczbą pierwszą.
Liczba 14 jest liczbą pierwszą.
Liczba 15 nie jest liczbą pierwszą.
Liczba 16 jest liczbą pierwszą.
Liczba 17 jest liczbą pierwszą.
Liczba 18 nie jest liczbą pierwszą.
Liczba 19 jest liczbą pierwszą.

0

Sorki, mój błąd:), wyedytowałem post. Miało być if (n % 2 == 0), to nam pozwala pominąć parzyste w iteracji.

0

Jeszcze raz dziękuję wszystkim za pomoc, ostateczny kod wygląda tak:

public class czyPierwsza{

    public static boolean czyPierwsza(int n) {
            if (n <= 2) return false;
            else if (n % 2 == 0) return false;
            int ind;
              for (ind = 3; ind <= Math.sqrt(n) + 1; ind += 2){
                if (n % ind == 0) return false;
              }
        return true;
        }

    public static void main(String[] args) {
        int n = 1;  

        for(n = 0; n<200; n++) {
        if (czyPierwsza(n)) {
            System.out.println("Liczba " + n + " jest liczbą pierwszą.");
            }
        else System.out.println("Liczba " + n + " nie jest liczbą pierwszą.");
        }
    }
    }
0

Trochę mi zeszło ponieważ moje JDK odmawiało współpracy. Rozwiązanie niby jest ale podrzucę jeszcze swoją wersję wypisującą po prostu liczby pierwsze, zamiast pisania x jest liczbą pierwszą, y nie jest liczbą pierwszą.

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

    public static void main(String[] args) {
        for(int i = 2; i < 500; i++) {
            if(isPrime(i) && isPrime(i + 2)) {
                System.out.print(i + " " + (i + 2) + " ");
            }
        }
    }
}

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