2017-11-30 5 views
0

Warum meldet mein Code, dass dieser Vorgang bis zu 5 Sekunden dauert, obwohl er in Echtzeit nicht einmal eine Viertelstunde dauert?Stoppuhr meldet keine korrekte Uhrzeit

Ich werde versuchen, den Code speziell für die Stoppuhr zu bolden, um Sie davon abzuhalten, alles durchzusehen. Sei nett, das ist mein erster Beitrag, also tut es mir leid, wenn es ungeschickt ist. Es sieht so aus, als ob der Code nicht umständlich ist.

* Hintergrund: Dies ist für einen Mathe-Aufsatz. Es soll ein Programm sein, das Hauptfaktoren findet und die Zeit angibt, wie lange es dauert, sie zu finden. Es arbeitet daran, die Hauptfaktoren zu finden, aber die Stoppuhr meldet eine lächerliche Zahl in Sekunden. Auch dieser Code am stärksten beeinflusst von

http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/

mit der Stoppuhr, eine Benutzereingabe-Funktion und Wiederholung hinzugefügt wird entweder durch meine eigenen Gedanken oder mit Hilfe anderer *

// Program to print all prime factors 
import java.io.*; 
import java.lang.Math; 
import java.util.Scanner; 
import java.text.DecimalFormat; 

class primeFactorer4 
{ 
    **static long startTime = System.nanoTime();** 
    // A function to print all prime factors 
    // of a given number n 
    public static void primeFactors(long n) 
    { 
     // Print the number of 2s that divide n 
     while (n%2==0) 
     { 
      System.out.print(2 + " "); 
      n /= 2; 
     } 

     // n must be odd at this point. So we can 
     // skip one element (Note i = i +2) 
     for (int i = 3; i <= Math.sqrt(n); i+= 2) 
     { 
      // While i divides n, print i and divide n 
      while (n%i == 0) 
      { 
       System.out.print(i + " "); 
       n /= i; 
      } 
     } 

     // This condition is to handle the case whien 
     // n is a prime number greater than 2 
     if (n > 2) 
      System.out.print(n); 
    } 

    public static void main (String[] args) 
    { 
     Console console = System.console(); 
     String input = console.readLine("Enter input:"); 
     long n = Long.valueOf(input); 
     for (int k=1; k<=10; k++) 
    { 
     primeFactors(n); 
     System.out.println(" Try " + k); 
    } 
     **double endTime = System.nanoTime(); 
     double totalTime = endTime - startTime; 
     DecimalFormat totalTimeFormat = new DecimalFormat("##.###"); 
     System.out.println(" Time taken in seconds:" + totalTimeFormat.format(totalTime/10/1000000000));** 
     primeFactorer4.main(args); 
    //reason for the weird division is for clarity. "totalTime" is the time surpassed 
    //to repeat all the methods, the "10" in the middle is to get the mean total time 
    //of all the primeFactors cycles, and the "1000000000" at the end is to convert nanoseconds into seconds 
    } 
} 

Der Grund Warum ich 10 Aufrufe an PrimeFactors gemacht habe ist, weil ich wollte, dass mein Computer das Mittel der Ergebnisse für mich macht, da jede Schule Ihnen sagen wird, dass Sie beim Experimentieren Ihre IV Stufe 3 (oder mehr) wiederholen müssen, um genauer zu werden Ergebnisse

+0

Sie können die Methode immer in eine 'for'-Schleife stecken und den Code sauberer machen. – UghThatGuyAgain

+0

Computer Mathe ist kein wissenschaftliches Experiment. Es zehnmal zu nennen ist sinnlos. –

+0

Dies ist nicht das ganze Experiment. Ich habe diese Ergebnisse in ein Diagramm gebracht, das die Größe der Zahl und die Zeit zum Finden der Primfaktoren und dann das Auffinden der Regressionsgerade beschreibt, die mein Lehrer mir gesagt hat, ist das Minimum, das erforderlich ist, um es math related lol zu machen. Mein Thema ist der Primfaktor, und tatsächlich ist der einzige Weg, den ich kenne, um Primfaktoren interessant zu machen, ein Aufsatz, wenn man über Kryptographie spricht. – regazzo

Antwort

0

Ich habe etwas für Sie geschrieben, ich denke, dass dies schneller und damit genauer sein kann, aber bedenken Sie, dass es Zeit braucht, ALLE Anweisungen auszuführen, damit sie nicht GENAU genau sein kann.

long start= System.currentTimeMillis(); //start time 
//Insert code here 
long difference = System.currentTimeMillis(); //finish time 
difference -= start; 
System.out.println("Time took to run code was " + difference);; //Print the amount of time that it took 
+0

Dank brenann, deins sieht weniger kompliziert und viel sauberer als meine, aber ich fand meine Lösung und es funktioniert gut. – regazzo

1

Okay, vergiss ich löste mein Problem. Ich habe einen println-Befehl unter den Variablen startTime und endTime eingegeben und festgestellt, dass die startTime-Variable beim Initiieren des Programms gestartet wurde, NICHT, wenn der Benutzer die Zahl eingibt, die sie faktorisieren wollen. Es gibt mir jetzt angemessene Ergebnisse, die nicht mit meiner persönlichen Geschwindigkeit der Eingabe von Zahlen verbunden sind.

Für diejenigen, die an dem Programm interessiert sind, die Lösung dieses Problems gilt für Sie, oder Sie sind einfach interessiert, den Kontrast zwischen der Lösung und dem Problem zu sehen, hier ist der neue Code.

// Program to print all prime factors 
import java.io.*; 
import java.lang.Math; 
import java.util.Scanner; 
import java.text.DecimalFormat; 

class primeFactorer4 
{ 

    // A function to print all prime factors 
    // of a given number n 
    public static void primeFactors(long n) 
     { 
      // Print the number of 2s that divide n 
      while (n%2==0) 
      { 
       System.out.print(2 + " "); 
       n /= 2; 
      } 

      // n must be odd at this point. So we can 
      // skip one element (Note i = i +2) 
      for (int i = 3; i <= Math.sqrt(n); i+= 2) 
      { 
       // While i divides n, print i and divide n 
       while (n%i == 0) 
       { 
        System.out.print(i + " "); 
        n /= i; 
       } 
      } 

      // This condition is to handle the case whien 
      // n is a prime number greater than 2 
      if (n > 2) 
       System.out.print(n); 
     } 



    public static void main (String[] args) 
    { 
     Console console = System.console(); 
     String input = console.readLine("Enter input:"); 
     long n = Long.valueOf(input); 
     long startTime = System.nanoTime(); 
     System.out.println(startTime); 
     for (int k=1; k<=10; k++) 
     { 
      primeFactors(n); 
      System.out.println(" Try " + k); 
     } 
     double endTime = System.nanoTime(); 
      System.out.println(endTime); 
      double totalTime = endTime - startTime; 
      DecimalFormat totalTimeFormat = new DecimalFormat("##.##########"); 
      System.out.println(" Time taken in seconds:" + totalTimeFormat.format(totalTime/10/1000000000)); 
     primeFactorer4.main(args); 
    //reason for the weird division is for clarity. "totalTime" is the time surpassed 
    //to repeat all the methods, the "10" in the middle is to get the mean total time 
    //of all the primeFactors cycles, and the "1e9" at the end is to convert nanoseconds into seconds 
    } 
}