Prosty program do sprawdzania czy dana liczba jest pierwsza

0

Witam. Napisałem krótki program który według założenia powinien stwierdzać czy liczba wpisana przez użytkownika jest liczbą pierwszą. Niestety nie wiem jakie równanie/działanie zrobić aby program dobrze działał.

Program:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {


        while (true) {

            String odpowiedz;                                                 

            Scanner liczbaUzytkownika = new Scanner(System.in);                       
            System.out.println("Witaj, czy chcesz rozpocząć? tak/nie + enter");     
            odpowiedz = liczbaUzytkownika.nextLine();                                          

            switch (odpowiedz) {                                                        
                case "tak":
                    System.out.println("Wpisz jakąś liczbę, a dowiesz się czy jest liczbą pierwszą.");

                    //program główny sprawdzający czy liczba jest pierwsza
                    int a;
                    Scanner liczba = new Scanner(System.in);
                    System.out.print("Twoja liczba= ");
                    a = liczba.nextInt();

                    if(a == 2 || a % a == 1) {                                                 //tutaj
                        System.out.println(a + " to liczba pierwsza");
                    } else if(a == 1 || a == 0 || a % a == 0) {                          //tutaj
                        System.out.println(a + " nie jest liczbą pierwszą");
                        //koniec głównego programu
                    }
                    break;
                case "nie":
                    System.out.println("No to nie");
                    break;

                default:
                    System.out.println("Upss... coś nie zadziałało. Prosimy spróbować ponownie.");
            }


        }
    }
}

Proszę o poradę co wpisać w nawiasach w liniach przy komentarzach "tutaj".

0

Sprawdzanie czy liczba jest pierwsza, nie jest takie proste :-)
Rzuć okiem np. na sito Eratostenesa.

0
 int liczbaDzielnikow = 0;	
                    for(int i=1;i<=a;i++){
                    	if(a%i==0)
                    	liczbaDzielnikow++;
                    }
                    if(liczbaDzielnikow==2) {                                                 //tutaj
                        System.out.println(a + " to liczba pierwsza");
                    } else  {                          //tutaj
                        System.out.println(a + " nie jest liczbą pierwszą");
                        //koniec głównego programu
                    }
0

Możesz też ustawić sito na liczby parzyste, które nie są liczbami pierwszymi:

 int liczbaDzielnikow = 0;
                    
                    for(int i=1;i<=a;i++){
                           if(a%2==0) {
                            /* 0 - ustawiamy na potrzebę oznaczenia ze jest parzysta i przez to nie jest liczba pierwsza */
                        	   liczbaDzielnikow = 0;
                        	   break;
                           }
    
                           if(a%i==0)
                           liczbaDzielnikow++;
    
                       }
                       if(liczbaDzielnikow==2||a==2) {   // 2- jako jedyna liczba parzysta jest liczba pierwszą
                           System.out.println(a + " to liczba pierwsza");
                       } else  {                          
                           System.out.println(a + " nie jest liczbą pierwszą");
    
                    }
2

Podchodzisz do problemu bardzo nieefektywnie.
Nie musisz liczyć dzielników liczby, żeby stwierdzić, czy jest ona pierwsza - jeżeli dzieli się przez cokolwiek innego niż 1 lub ona sama, to nie jest liczbą pierwszą.
Jeżeli sprawdzasz liczbę 10, to wystarczy sprawdzić, ze dzieli się przez 2, nie trzeba już sprawdzać dzielenia przez 5.
Jeżeli liczba pierwsza ma jedynie 1 dzielnik (np. 9 dzieli się jedynie przez 3) to wartość dzielnika jest równa pierwiastkowi kwadratowemu tej liczby.
Jeżeli dzielników jest więcej to przynajmniej jeden będzie mniejszy niż pierwiastek kwadratowy z testowanej liczby.

    public static boolean primeTest(int x){
        if(x == 2){
            return true;
        }

        if (x == 1 || x % 2 == 0)
        {
            return false;
        }

        int limit = (int)Math.sqrt(x);
        for(int i = 3; i <= limit; i = i + 2 ){
            if (x % i == 0)
            {
                return false;
            }
        }
        return true;
    }


Będzie to działać dużo szybciej od twojego rozwiązania, ale nadal jest to podejście naiwne. W praktyce wykorzystywane są dla dużych liczb metody oparte na prawdopodobieństwach - test pierwszości Fermata pozwalający szybko sprawdzić, że dana liczba jest pierwsza z założonym prawdopodobieństwem.

0

Dzięki gk1982. Wszystko działą. Mam jeszcze kilka pytań:

  1. Jak w danych tekstowych w Stringu zrobić aby tekst był automatycznie przerabiany na małe lub duże litery?
  2. Czy przy pisaniu kody dane int, String tworzyć przed samym użyciem czy na początku kodu i tam je opisywać?
    3)Czy da się ze stringa wywalić wszystkie spacje tak aby został tylko ciąg znaków?
    Z góry dzięki za odpowiedzi. ;-)
0

Kod działa ale proszę o sprawdzenie co robię źle bo coś nie wychodzi tak jak powinno.

import java.util.Scanner;

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

            String odp;
            Scanner odczyt = new Scanner(System.in);
            System.out.println("Witaj, czy chcesz rozpocząć? tak/nie + enter");
            odp = odczyt.nextLine();

            switch(odp) {
                case "tak":
                    int liczbaUzytkownika;
                    Scanner odczyt2 = new Scanner(System.in);
                    System.out.println("Wpisz jakąś liczbę, a dowiesz się czy jest liczbą pierwszą.");
                    liczbaUzytkownika = odczyt2.nextInt();
                    int a = 0;
                    int liczbaDzielnikow = 0;
                    for (int i = 1; i <= a; i++) {
                        if (a % 2 == 0) {
                            liczbaDzielnikow = 0;
                            break;
                        }
                        if (a % i ==0)
                            liczbaDzielnikow++;
                    }
                    if (liczbaDzielnikow == 2 || a == 2) {
                        System.out.println(a + " to liczba pierwsza");
                    } else {
                        System.out.println(a + " nie jest liczbą pierwszą");
                    }
                    break;
                case "nie":
                    System.out.println("No to nie");
                    break;
                default:
                    System.out.println("Upss... coś nie zadziałało. Prosimy spróbować ponownie.");
        }
    }
}

0
                        if (a % 2 == 0) {
                            liczbaDzielnikow = 0;
                            break;
                        }

Co to robi i dlaczego?

Upss... coś nie zadziałało.

Lepiej chyba będzie wypisać podałeś błędny tekst ;-)

0

Wszystkie zmienne - a musisz zamienić teraz na liczbaUzytkownika...

import java.util.Scanner;

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

            String odp;
            Scanner odczyt = new Scanner(System.in);
            System.out.println("Witaj, czy chcesz rozpocząć? tak/nie + enter");
            odp = odczyt.nextLine();

            switch(odp) {
                case "tak":
                    int liczbaUzytkownika;
                    Scanner odczyt2 = new Scanner(System.in);
                    System.out.println("Wpisz jakąś liczbę, a dowiesz się czy jest liczbą pierwszą.");
                    liczbaUzytkownika = odczyt2.nextInt();
                    
                    int liczbaDzielnikow = 0;
                    for (int i = 1; i <= liczbaUzytkownika; i++) {
                        if (liczbaUzytkownika % 2 == 0) {
                            liczbaDzielnikow = 0;
                            break;
                        }
                        if (liczbaUzytkownika % i ==0)
                            liczbaDzielnikow++;
                    }
                    if (liczbaDzielnikow == 2 || liczbaUzytkownika == 2) {
                        System.out.println(liczbaUzytkownika + " to liczba pierwsza");
                    } else {
                        System.out.println(liczbaUzytkownika + " nie jest liczbą pierwszą");
                    }
                    break;
                case "nie":
                    System.out.println("No to nie");
                    break;
                default:
                    System.out.println("Upss... coś nie zadziałało. Prosimy spróbować ponownie.");
        }
    }
}
0
IlikeJava napisał(a):

Dzięki gk1982. Wszystko działą. Mam jeszcze kilka pytań:

  1. Jak w danych tekstowych w Stringu zrobić aby tekst był automatycznie przerabiany na małe lub duże litery?
  2. Czy przy pisaniu kody dane int, String tworzyć przed samym użyciem czy na początku kodu i tam je opisywać?
    3)Czy da się ze stringa wywalić wszystkie spacje tak aby został tylko ciąg znaków?
    Z góry dzięki za odpowiedzi. ;-)

Odp: 1 )

String odp = "ABCD";

//zamiana na małe litery
odp.toLowerCase();
//zamiana na duże litery
odp.toUpperCase();

Odp 2)
Zmienne int/String tworzysz i opisujesz na początku ich zasięgu jakiegoś bloku {},
jeżeli potrzebne dane są tylko w pętli to przed pętlą tworzysz lub w pętli.
Jak dane będą potrzebne w całym programie to na początku programu.

Odp 3)

//wywala wszystkie spacje ze stringa i jeszcze kilka znaków np.: tabulatory 
odp.replaceAll("\\s+","");
0
gk1982 napisał(a):

Wszystkie zmienne - a musisz zamienić teraz na liczbaUzytkownika...

Dzięki, działa.

Patryk27 napisał(a):
                        if (a % 2 == 0) {
                            liczbaDzielnikow = 0;
                            break;
                        }

Co to robi i dlaczego?

Upss... coś nie zadziałało.

Lepiej chyba będzie wypisać podałeś błędny tekst ;-)

OK. ;)

. Program jak na razie skończony. Dzięki za odpowiedzi :)

0

A takie pytanko. Gdzie dać metody:

.replaceAll("\\s+",""); 
.toLowerCase():

w kodzie

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        String text1;
        Scanner a = new Scanner(System.in);
        System.out.println("Wpisz tekst wzorcowy");
        text1 = a.nextLine();

        String text2;
        Scanner b = new Scanner(System.in);
        System.out.println("Wpisz tekst do porównania");
        text2 = b.nextLine();

        text1.toLowerCase().replaceAll("\\s+","");
        text2.toLowerCase().replaceAll("\\s+","");



        if(text1.equals(text2)){
            System.out.println("Oba teksty są identyczne");
        } else {
            System.out.println("Teksty nie są identyczne");
        }


    }
}

Tak aby działało usunięcie spacji i innych znaków ze Stringów do porównania?

0

zamień

text1.toLowerCase().replaceAll("\\s+","");
text2.toLowerCase().replaceAll("\\s+","");

na

text1 = text1.toLowerCase().replaceAll("\\s+","");
text2 = text2.toLowerCase().replaceAll("\\s+","");
0

Ooo dzięki wszystko działa.

0

Witam.
Chciałbym zrobić program który będzie szyfrował wpisany przez użytkownika tekst. I mam pytanie, jak to zrobić? :p Mam taki pomysł aby tekst wprowadzony przez użytkownika był przerabiany według podanego wcześniej wzorca np.

String a = test;
tekstWyjsciowy = tekstWyjsciowy.toLowerCase();

for (int i =0; i > a.lenght; i++) {
Switch(inputTekstUzytkownika) {
       case "t":
       tekstWyjsciowy + "b";
       break;
       
      case "e":
      tekstWyjsciowy + "c";
      break;
    
      case "s":
      tekstWyjsciowy + "x";
      break;
}
}       
```
Chodzi mi o to aby było tyle takich Stringów 'a'  ile liter w zmiennej i aby do tekstWyjsciowy była dodawana już zmieniona litera tak jak na przykładzie powyżej. tekstWyjsciowy powinien zawierać: 'bcxb'. Proszę o wytłumaczenie bo taki sposób na pewno istanieje a coś czuję, że kiedyś mi się to przyda. :)

P.S. 
Wiem że ten przykład jest źle zrobiony ale jest tylo po to żeby zobrazować o co mi chodzi.
0

Nie wiem o co Ci chodzi, ale może prosty szyfr cezara Ci się przyda:


String textJawny = "test";
	int klucz;
        klucz = 10;
		
        int  dlugosc = textJawny.length();
	byte[] tz = new byte[dlugosc];
	for(int i=0; i < dlugosc; i++){
			
            char znak = textJawny.charAt(i);
            byte kodASCI = (byte)(znak);
            tz[i] = (byte)((kodASCI+klucz)%256);
			
	}
		
	String textZaszyfrowany=""+new String(tz);
        
        System.out.println(""+textZaszyfrowany);

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