1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

java problem

Discussion in 'Programmieren' started by psychofreak, Nov 20, 2007.

Thread Status:
Not open for further replies.
  1. hi leute,

    ich wollte folgendes rätsel mit java lösen:

    ein könig plant zu seinem 50 geburtstag die freilassung einiger gefangener.
    er hat 500 kerkerzellen. er beautragt seinen kerkermeister 500 mal an jeder zelle vorbei zu gehen. beim 1. durchgang soll er jedes schloss aufschießen, beim 2. jedes 2., beim 3. jedes 3. usw ... die schlösser sind so gebaut, dass sie nach einmaligem umdrehen aufgehen, nach 2. umdrehen wieder zu gehen.
    wieviele gefangene kommen frei?

    das hab ich mit folgenem code probiert:

    Code:
     class raetsel{
     
     void durchgang() {
      int p = 0;
      boolean offen[] = new boolean[500];
      while( (p < 499) ) {
       offen[p] = false;
       p++;
      }
    
      int o = 0;           //offene zellen
      int v = 0;           //zum array durchlaufen
      int d = 1;           //durchgangsnummer
      int x = 500/(500/d); //zum berechnen der schlossnummer des schlosses welches als nächstes gedreht wird
    
      while( (d < 500) ) {
       while(offen[v] = false && (v < 499) ) {
        offen[v] = true;
        v = v + x;
        o++;
       }
       while(offen[v] = true && (v < 499) ) {
        offen[v] = false;
        v = v + x;
        o--;
       }
       d++;
       System.out.println(o);
      }
     }
    }
    
    public class koenigsraetsel {
     public static void main(String[] args) {
      raetsel koenig = new raetsel();
      koenig.durchgang();
     }
    }   
      
    
    
    
    als ergebnis nekomme ich immer o = -499 bei jeder aufgabe

    ich habe mit java noch nich sehr viel erfahrung also könnte mir jemand meinen fehler sagen ...
    danke schon mal im vorraus

    mfg psycho
     
  2. Michi0815

    Michi0815 Guest

    vergleiche werden unter java mit 2 '=' durchgeführt. also
    while((offen[v] == false) && (v < 499) ) {

    ist aber trotzdem falsch, weil jetzt immer 499 rauskommt ;)

    ich würde mal sagen, dass das ergebnis stark von der geometrie des gefängnisses abhängt. geht der wärter von 0-499 und beginnt dann wieder bei 0 oder dreht er einfach um und geht von 499 richtung 0?

    in jedem fall funktioniert dein programm nicht, weil du weder die "schrittweite" x änderst noch die aktuelle zellenposition v zurücksetzt. die steht nämlich nach dem ersten while-durchgang fix auf 499.
     
  3. wenn ich nun aus dem = ein == mache und unter System.out.println(o); v = 0 setzte geht es dann? denn meiner meinung nach wird x geeändert, da nach jedem durchgang d um 1 erhöht wird und x mit x = 500/(500/d) definiert ist. (fragt mich nicht wie ich auf diese gleichung gekommen bin aber nach meinen Rechnung funktioniert sie.) bsp: 500/(500/2)=500/250=2 -> x = 2 ->v = v + x => im 2. durchgang wird jede ungerade zelle ausgelassen(wenn der wärter wieder bei null anfängt).
    stimmt das jetzt? xD
    ich probiers gerade mal aus.

    e: ok es geht nicht. jetz kommt abwechselnd 0 und 499 raus.
     
  4. Die Berechnung für X als Integer ist ungenau.
    500/(500/3) gibt z.B. keinen Int-Wert und wird daher gerundet.... So werden einige Türen zu oft und andere zu selten auf/zugeschlossen.

    Ausserdem müsste X in der Schleife berechnet werden, da sie sonst nicht an den Durchlauf angepasst wird....
    Du erhöhst zwar die Variable d, jedoch hat das keinen Einfluss auf die Berechnung für x vor der Schleife...

    Sinnvoller als die Berechnung wäre mit Modulo zu arbeiten.
     
  5. Michi0815

    Michi0815 Guest

    du speicherst keine formel sondern werte. in x steht das ganze programm über genau 1.
     
  6. was ist modulo?

    e: wenn ich nun x mit long x = 500/(500/d) definiere kann ich es doch später mit x = (int) x zu einem integer wert machen oder? schließlich kommt immer eine ganze zahl als endergebniss raus. mein comiler ist irgentwie dagegen :was:
     
  7. Restwert-Operator. Siehe http://www.galileocomputing.de/openbook/javainsel6/javainsel_02_004.htm#Xxx1000508

    Du kannst hier konvertieren, wie du lustig bist. wenn du die Nachkommastellen bei der Berechnung einfach nur abschneiden lässt, stimmen die Türen nicht.
     
  8. nein ich dachte, dass, wenn ich mit long rechne, die kommazahlen mitgerechnet werden, dann ein ergebnis ohne kommazahlen herauskommt und ich es dann zu einem integerwert machen kann. bis mir aufgefallen ist, dass 500 weit auserhalb des bereichs der variable long liegt ... also ihr habt wohl recht ... das mit dem script wird nichts ^^ ( das mit dem modulo schau ich mir jetz noch an)
    aber trotzdem danke für die hilfe
     
  9. Michi0815

    Michi0815 Guest

    sorry wenn ich das so direkt sage:
    ist ohnehin lötzinn

    elementares bruchrechnen aus der grundschule:
    Code:
          500
    x = ------- = d
          500
         -----
           d
    
     
  10. x = d stimmt doch oder? das is mir auch aufgefalln un wenns doch nich stimmt dann ist das mir jetz auch egal, da 1. ich grade keine lust mehr habe 2. ich in 6 einhalb stunden wieder aufstehn muss und 3. das sowieso nix wird mit dem script
    aber trotzdem danke ...
     
  11. mal als Anregung ein Beispiel:
    Code:
    for (int i=1;i<51;i++){
    	for (int j=1;j<51;j++)
    	System.out.println(i + ", " +j + ", " + j%i);
    }
    musst nur noch herausfinden, wann die richtige Tür j im Durchgang i erreicht ist.
     
Thread Status:
Not open for further replies.

Share This Page