Exercise "Smallest multiple "





  • Weil das Programm relativ lange braucht um durchzurechnen ist es ggf. sinnvoller die Loop mit der höchsten Zahl zu beginnen. Die Zahl 20 ist durch deutlich weniger Zahlen teilbar als z.B.: die Zahl 2. Geht man von hinten durch, spart man sich einige Rechenoperationen, welche bei mir das Ergebnis ca. 1,5 Sekunden schneller finden lässt.

    for (int i = highestDivisor; i > 1; i--) {
        if (0 != candidate % i) { // Is there a non-zero remainder?
            atLeastOneRemainder = true; // Continue outer while.
            break; // Leave current for loop.
        }
    }
    

    Ich hoffe das ist nicht zu pingelig. 😉



  • @Cabanis Na ja, aus meiner Sicht ist Erbsenzählen ein wichtiger Teil der Softwareentwicklung. Zum testen der Ausführungszeit habe ich um den gesamten Code folgende »Klammer« gesetzt:

    final long startTime = System.currentTimeMillis();
    
    // ... Berechnungscode ...
    
    System.out.println("Duration:" + (System.currentTimeMillis() - startTime));
    

    Für die bisherige Musterlösung ergaben sich auf meinem ansonsten unbelasteten System folgende Werte:

    1225, 1223, 348, 1374, 348, 1229, 347, 351, 1219, 348
    

    Auffällig ist Wechsel der Ausführungszeiten zwischen ~350ms einerseits und ~1224 ms andererseits. Ich habe keine Erklärung und tippe auf zufällige Effekte des OS Schedulers. Verwende ich Ihre Umkehrung der Schleife, so ergibt sich:

    306, 306, 307, 309, 307, 306, 306, 305, 305, 808
    

    Hier tritt nur ein »Ausreisser« auf. Zudem sind die Ausführungszeiten, wie von Ihnen grundsätzlich erwartet, um ~10% niedriger



  • @Dr-Martin-Goik Vielen Dank für das Testen! 😉

    Interessant das dort so unterschiedliche Ergebnisse rauskommen... Ich habe das ganze mit der nanoTime() Funktion erledigt.

    //Musterlösung
    3992439100
    4019978900
    4184481000
    
    //Loop von hinten
    2599831800
    2559674600
    2589490200
    

    Ich bin beeindruckt von Ihrer CPU Leistung.. Bei mir braucht es 4 Sekunden für das berechnen. Scheint als müsst ich mir mal eine neue CPU zulegen...

    Schönen Abend noch!


Log in to reply