(Java) Happy Numbers in Anlehnung an den Sieb des Eratosthenes (Glueckliche Zahlen)

Hey Leute,

ich benötige eure Hilfe bei folgender Aufgabenstellung: Programmiere eine Klasse, welche eine Zahl uebergeben bekommt und anhand dieser Zahl einen Array mit der Laenge der uebergebenen Zahl erstellt. Anschließend wird der geamste Array auf true gesetzt. Danach soll jedes 2.te Array auf false gesetzt werden, von den übrig gebliebenen Arrays (also die, die noch ture sind) soll jedes dritte Array auf false gesetzt werden usw. Zum Schluss soll ausgegeben werden welche Array noch auf true sind.

Beispiel:

  1. 1,2,3,4,5,6,7,8,9,10
  2. 1,,3,,5,,7,,9,*
  3. 1,3,*,7,9
  4. 1,3,7,*
  5. Ausgabe: 1,3,7

Mein Loesungsansatz:

  public static void happy ( boolean[] s) {
        int n = s.length;                                          //für die for-schleifen
        for (int k = 0; k < n; k++) {
            s[k] = true;                                          //alle Arrays werden erst einmal auf "true" gesetzt
        }
        
        
        for (int i = 1, k=2; i < n; i=i+k){              //Ausfilterung der Unhappy Numbers
        	      s**=false;
        
        	      if (i+k>=n){                            //der Index wird zurückgesetzt und die Schrittweite wird um 1 erhöht
          		i=0;
        		k++;
        	}
        	
        }
    	 
    }
    
    public static void main( String[] args) {
  
        int n = Integer.parseInt(args[0]);
        
      boolean[] tabelle = new boolean[n];// default-Init. = false
      
      System.out.println("Happy Numbers: ");
      happy(tabelle);
      for ( int i = 2; i < n; ++i) 
          if (tabelle** == true)
              System.out.print( i + " ");
   }
}```

Bei diesem Lösungsansatz wird das Arrayfeld 6 schon auf false gesetzt - also die Dezimalzahl 7...wie könnte man das effektiv umgehen?
Ich hatte noch andere Ansätze wie:

   ``` public static void happy ( boolean[] s) {
        int n = s.length;
        for (int k = 0; k < n; k++) {
            s[k] = true;
        }
        
        
        for (int i = 0, k=2; i < n; i=i+k){           //i wurde hier auf 0 gesetzt und man greift mit [i+1] auf die Array Speicherzellen zu
        			s[i+1]=false;
      	
               	if (i+k>=n){
        		i=0;
        		k++;
        	}
        	
        }```

Bei dieser Lösung läuft er über den Array-Index hinaus...und mir fällt keine möglichkeit ein, wie ich das umgehen kann. Ich hatte mir gedacht, dass man das evtl mit einer Fallabfrage -dass nur dann auf false gesetzt wird, wenn bereits ein Wert vorhanden ist- lösen könnte.

```for (int i = 0, k=2; i < n; i=i+k){
        	if(s[i+1]==true || s[i+1]==false){
        			s[i+1]=false;
        	}
      	
               	if (i+k>=n){
        		i=0;
        		k++;
        	}
        	
        }```

Auch hierbei entsteht ein Überlauf, so dass das Programm beendet wird und ich keine Ahnung habe wie ich diesen Fehler umgehen könnte.

Hätte von euch evtl jemand einen Lösungsansatz, oder ist eine der Teillösungen schon ansatzweise richtig?

Ich habe das Gefühl, dass ich komplett auf dem Holzweg bin...

Vielen Dank im Voraus:D

Versuche doch mal etwas Ordnung hereinzubekommen.

Funktionen die wachsen, neigen dazu unübersichtlich zu werden.

Teile das Programm in kleine übersichtliche Funktionen auf.
Ich würde diese wählen. Die jeweiligen Methodennamen und dazugehörenden Implementierungen seinen mal dir überlassen.


public arr setEveryNthToFalse(boolean[] arr, int every) {...}

public int countTruesInArray(boolean[] arr) {...}

public void printArray(boolean[] arr) {...}```

Das printArray ist Insofern interessant, da man sich die einzelnen zwischenschritte recht einfach ausgeben lassen kann.

Daraus kann man dann einen Algorithmus bauen.

```public void happyNumbers(int n){
  boolean[] arr = createTrueArray(n);
  int i = 2;
  while(i <= countTruesInArray(arr)) {
    arr = setEveryNthToFalse(arr, i);
    i++;
    //Zum Debuggen auskommentieren!
    //printArray(arr)
  }
  printArray(arr);
}```

ich hab hier eine Klasse, ich wollte gerne wenn man auf eine Zelle der Tabelle klickt, dass sich dann ein Browser Fenster öffnet. Ich hab das mit der Methode if (isCellselected… versucht aber dort öffnet sich der Browser mehrmals. Hat einer Idee wie ich das verändern kann damit die Seite nur einmal geöffnet wird.