Primzahlen



  • So was ähnliches habe ich auch!

    Wie verarbeite ich es denn, dass ich die Obere und Unteregrenze der Zahlen doie Überprüft werden sollen noch einlesen soll.



  • Wie die Eingabe in Java realisiert wird, weiß ich nicht mehr so genau. Aber du kannst ja den obigen Block in eine Schleife "for(n=uGrenze;n<=oGrenze;++n)" setzen.



  • Hi

    Oder schau dir BigInteger an. Die haben bereits die Methode isProbablePrime() impelmentiert. 😃 wird aber wohl nicht das sein, was du verwenden darfst. Auserdem ist BigInteger für richtig grosse zahlen gedacht.

    gruss Termite



  • BigInteger fuer Primzahlenrechnungen zu verwenden ist das gleiche wie heute schlafen gehn, in 100 Jahren aufstehn und das selbe Programm in c zu schreiben!

    Ist viel zu langsam!!!! Schon bei kleinen Zahlen wird das extrem aufwendig.

    Fuer die Eingabe in Java verwendet man
    System.in
    oder man kann auch
    JOptionPane (Wenns ein wenig Graphisch sein darf)
    verwenden.



  • import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Prim extends JFrame implements ActionListener {
    	private int untergrenze = 3;
    	private int obergrenze = 5000;
    	private JTextField ut = new JTextField(8);	
    	private JTextField ot = new JTextField(8);
    	private JTextArea area = new JTextArea();
    
    	Prim() {
    		JPanel content = (JPanel)getContentPane();
    		JScrollPane scroll = new JScrollPane(area);
    
    		JPanel pan = new JPanel();
    		JLabel ul = new JLabel("Untere Grenze:");
    		JLabel ol = new JLabel("Obere Grenze:");
    
    		ut.setText(""+untergrenze);
    		ot.setText(""+obergrenze);
    		JButton apply = new JButton("starten");
    		apply.addActionListener(this);
    		pan.add(ul);
    		pan.add(ut);
    		pan.add(ol);
    		pan.add(ot);
    		pan.add(apply);
    		content.setLayout(new BorderLayout());
    		content.add(pan, BorderLayout.NORTH);
    
    		content.add(scroll);
    		setVisible(true);
    	}
    
    	public boolean isPrime(int n) {
    		boolean prim=true;
    		for(int i=2;i <= Math.sqrt(n); ++i) {
      			if(n%i==0) {
      				prim=false;
      				break;
      			}
    		}
    		return prim;
    	}
    
    	public void actionPerformed(ActionEvent evt) {
    		untergrenze = Integer.parseInt(ut.getText());
    		obergrenze = Integer.parseInt(ot.getText());
    		area.setText("");
    		for(int i = untergrenze; i <= obergrenze; ++i) {
    			area.append(""+i+ " : ");
    			if(isPrime(i)) {
    				area.append(" ist prim\n");
    			}
    			else {
    				area.append(" ist nicht prim\n");
    			}
    		}
    	}
    
    	public static void main(String args[]){
    		Prim p = new Prim();	
    		p.setLocation(100, 100);
    		p.setSize(600, 400);
    		p.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		p.setVisible(true);
    	}
    }
    


  • Da sieht man mal wieder, wie ein 4-zeiliges C++-Programm von dem Java-Kram total aufgebläht wird.



  • Die 4 Zeilen sind erstens kein vollständiges Programm und zweitens ist da auch keine graphische Benutzeroberfläche wie in diesem Java-Programm enthalten!



  • Stimm, aber in C++ benötigt man auch keine Grafik, um was auszutesten 😉

    btw, die isPrime-Funktion könnte noch gekürzt werden:

    public boolean isPrime(int n) { 
        for(int i=2;i <= Math.sqrt(n); ++i)
            if(n%i==0) return false;
        return true;
    }
    


  • Um dasselbe in Java zu machen braucht es gerade mal eine Zeile mehr, als in C++. Von aufblähen kann dann gar keine Rede sein. Wenn man allerdings Äpfel mit Birnen vergleicht ...



  • Stimm, aber in C++ benötigt man auch keine Grafik, um was auszutesten

    voll trollig, denkst in Java braucht man eine GUI um was zu testen ?



  • Wer hat denn angefangen, um meinen Codeschnipsel ein "komplettes" Java-Prog drumrumzucoden?



  • Die vorgestellten Codeschnipsel sind aus meiner Sicht nicht korrekt.
    0 und 1 sind keine Primzahlen und es gibt ja auch negative Primzahlen!

    Eine bereinigte Version mit grafischer Programmoberfläche und Eingabeüberprüfung:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Primzahl implements ActionListener {
    	JFrame primFrame;
    	JPanel primPanel, inPanel;
    	JTextField number;
    	JLabel primLabel;
    	JButton testNumber;
    
    	public Primzahl() {
    		// Erzeugung und Einstellung des Frame
    		primFrame = new JFrame( "Primzahltest" );
    		primFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		primFrame.setSize( new Dimension( 200, 150 ) );
    
    		// Erzeugung und Einstellung des Fensterpanel
    		primPanel = new JPanel( new BorderLayout() );
    		primPanel.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
    
    		// Erzeugung und Einstellung des Eingabepanel
    		inPanel = new JPanel( new BorderLayout() );
    		inPanel.setBorder( BorderFactory.createEmptyBorder( 0, 0, 5, 0 ) );
    
    		// Erzeugung und Einstellung der Elemente des Fensterinhalt
    		number = new JTextField( 2 );
    		primLabel = new JLabel( "", SwingConstants.CENTER );
    		testNumber = new JButton( "OK" );
    
    		// Erzeugung einer Ereignisüberwachung auf den OK-Button
    		testNumber.addActionListener( this );
    
    		// Hinzufügung der Elemente zum Eingabepanel
    		inPanel.add( number, BorderLayout.CENTER );
    		inPanel.add( testNumber, BorderLayout.EAST );
    
    		// Hinzufügung der Elemente zum Fensterpanel
    		primPanel.add( inPanel, BorderLayout.NORTH );
    		primPanel.add( primLabel, BorderLayout.CENTER );
    
    		// Hinzufügung des Fensterpanel zum Frame
    		primFrame.getContentPane().add( primPanel, BorderLayout.CENTER );
    
    		// Setzen des voreingestellten Button
    		primFrame.getRootPane().setDefaultButton( testNumber );
    
    		// Sichtbarmachung des Frame
    		primFrame.setVisible( true );
    	}
    
    	public void actionPerformed( ActionEvent event ) {
    		Integer n = 0;
    		boolean eingabe = true;
    		primLabel.setBorder( BorderFactory.createTitledBorder( "Auswertungsergebnis" ) );
    		try {
    			// Eingabedaten auslesen
    			n = Integer.parseInt( number.getText() );
    		} catch (NumberFormatException e) {
    			primLabel.setText( "<html>" + number.getText() + " ist <u><font color=red>keine Ganzzahl</font></u></html>" );
    			eingabe = false;
    		}
    		if ( eingabe ) {
    			// auf Primzahl testen
    			if ( isPrim( n ) ) {
    				primLabel.setText( "<html>" + number.getText() + " ist <u><font color=green>eine Primzahl</font></u></html>" );
    			} else {
    				primLabel.setText( "<html>" + number.getText() + " ist <u><font color=red>keine Primzahl</font></u></html>" );
    			}
    		}
    	}
    
    	/**
    	 * Testet auf eine Primzahl.
    	 */
    	public static boolean isPrim( Integer n ) {
    		boolean ergebnis = true;
    		for( int i = 2; i <= Math.sqrt( Math.abs( n ) ); ++i ) {
    			if ( n % i == 0 ) {
    				ergebnis = false;
    				break;
    			}
    		}
    		if ( n == 0 || n == 1 ) {
    			ergebnis = false;
    		}
    		return ergebnis;
    	}
    
    	/**
    	 * Erzeugt die Programmoberfläche und bringt sie auf das Bild.
    	 * Für die Thread-Sicherheit sollte diese Methode aus dem
    	 * Ereignisabfertigungs-Thread aufgerufen werden.
    	 */
    	public static void createAndShowGUI() {
    		// Nutzung der voreingestellten Fenster-Dekoration
    		JFrame.setDefaultLookAndFeelDecorated( true );
    
    		Primzahl prim = new Primzahl();
    	}
    
    	public static void main( String[] args ) {
    		// Aufgabe für den Ereignisabfertigungs-Thread:
    		// Erzeugen und Anzeigen der Programmoberfläche
    		javax.swing.SwingUtilities.invokeLater( new Runnable() {
    			public void run() {
    				createAndShowGUI();
    			}
    		} );
    	}
    }
    


  • A schrieb:

    es gibt ja auch negative Primzahlen!

    Nein. Alle Primzahlen sind >= 2.



  • Was für ein Schwachsinn.



  • A schrieb:

    Was für ein Schwachsinn.

    http://en.wikipedia.org/wiki/Prime_number

    In mathematics, a prime number (or prime) is a natural number greater than one whose only positive divisors are one and itself.



  • Jaja, du hast Recht. :p Schwarz auf weiß.
    Geht auch in deutsch: http://de.wikipedia.org/wiki/Primzahlen



  • So, jetzt dürfte es korrekt sein.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Primelement implements ActionListener {
    	JFrame primFrame;
    	JPanel primPanel, inPanel;
    	JTextField number;
    	JLabel primLabel;
    	JButton testNumber;
    
    	public Primelement() {
    		// Erzeugung und Einstellung des Frame
    		primFrame = new JFrame( "Primelement" );
    		primFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		primFrame.setSize( new Dimension( 200, 150 ) );
    
    		// Erzeugung und Einstellung des Fensterpanel
    		primPanel = new JPanel( new BorderLayout() );
    		primPanel.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
    
    		// Erzeugung und Einstellung des Eingabepanel
    		inPanel = new JPanel( new BorderLayout() );
    		inPanel.setBorder( BorderFactory.createEmptyBorder( 0, 0, 5, 0 ) );
    
    		// Erzeugung und Einstellung der Elemente des Fensterinhalt
    		number = new JTextField( 2 );
    		primLabel = new JLabel( "", SwingConstants.CENTER );
    		testNumber = new JButton( "OK" );
    
    		// Erzeugung einer Ereignisüberwachung auf den OK-Button
    		testNumber.addActionListener( this );
    
    		// Hinzufügung der Elemente zum Eingabepanel
    		inPanel.add( number, BorderLayout.CENTER );
    		inPanel.add( testNumber, BorderLayout.EAST );
    
    		// Hinzufügung der Elemente zum Fensterpanel
    		primPanel.add( inPanel, BorderLayout.NORTH );
    		primPanel.add( primLabel, BorderLayout.CENTER );
    
    		// Hinzufügung des Fensterpanel zum Frame
    		primFrame.getContentPane().add( primPanel, BorderLayout.CENTER );
    
    		// Setzen des voreingestellten Button
    		primFrame.getRootPane().setDefaultButton( testNumber );
    
    		// Sichtbarmachung des Frame
    		primFrame.setVisible( true );
    	}
    
    	public void actionPerformed( ActionEvent event ) {
    		Integer n = 0;
    		boolean eingabe = true;
    		primLabel.setBorder( BorderFactory.createTitledBorder( "Auswertungsergebnis" ) );
    		try {
    			// Eingabedaten auslesen
    			n = Integer.parseInt( number.getText() );
    		} catch (NumberFormatException e) {
    			primLabel.setText( "<html>" + number.getText() + " ist <u><font color=red>keine Ganzzahl</font></u></html>" );
    			eingabe = false;
    		}
    		if ( eingabe ) {
    			// auf Primelement testen
    			if ( isPrim( n ) ) {
    				primLabel.setText( "<html>" + number.getText() + " ist <u><font color=green>ein Primelement</font></u></html>" );
    			} else {
    				primLabel.setText( "<html>" + number.getText() + " ist <u><font color=red>kein Primelement</font></u></html>" );
    			}
    		}
    	}
    
    	/**
    	 * Testet auf eine Primelement.
    	 */
    	public static boolean isPrim( Integer n ) {
    		boolean ergebnis = true;
    		for( int i = 2; i <= Math.sqrt( Math.abs( n ) ); ++i ) {
    			if ( n % i == 0 ) {
    				ergebnis = false;
    				break;
    			}
    		}
    		if ( n == 0 || n == 1 ) {
    			ergebnis = false;
    		}
    		return ergebnis;
    	}
    
    	/**
    	 * Erzeugt die Programmoberfläche und bringt sie auf das Bild.
    	 * Für die Thread-Sicherheit sollte diese Methode aus dem
    	 * Ereignisabfertigungs-Thread aufgerufen werden.
    	 */
    	public static void createAndShowGUI() {
    		// Nutzung der voreingestellten Fenster-Dekoration
    		JFrame.setDefaultLookAndFeelDecorated( true );
    
    		Primelement prim = new Primelement();
    	}
    
    	public static void main( String[] args ) {
    		// Aufgabe für den Ereignisabfertigungs-Thread:
    		// Erzeugen und Anzeigen der Programmoberfläche
    		javax.swing.SwingUtilities.invokeLater( new Runnable() {
    			public void run() {
    				createAndShowGUI();
    			}
    		} );
    	}
    }
    




  • @ Gregor & Detector:
    🤡



  • Dürfte ich einwenden, dass es sinnvoll wäre n == 0 || n == 1 vor der Wurzelberechnung und der dazugehörigen Schleife abzuprüfen?

    Oder habt ihr alle zu viele CPU Cycles übrig? 😃


Anmelden zum Antworten