SJ 21/22: Klasse 9d: Unterschied zwischen den Versionen

Aus MINT.lentner.net
Zur Navigation springen Zur Suche springen
Zeile 130: Zeile 130:
  
 
... immer noch unter einer Sekunde!
 
... immer noch unter einer Sekunde!
 +
 +
//Teiler ermitteln
 +
//Wir berechnen immer sofort kleine Teiler und Gegenteiler
 +
x=91747111730317;
 +
 +
//Berechne den größtmöglichen kleinen Teiler
 +
obergrenze=Math.floor(Math.sqrt(x));
 +
UI.log(obergrenze);
 +
 +
//Schleife: Test aller Teiler von x
 +
teiler=1;
 +
while(teiler<=obergrenze) {
 +
    if(x%teiler==0) UI.log(x+" = "+teiler+" * "+ x/teiler);
 +
    teiler=teiler+1;
 +
}

Version vom 13. Mai 2022, 09:57 Uhr

Spanisch-Zweig (einstündig - IT Wahlpflichtfächergruppe IIIa)
Bezeichnung in der SchulApp: IT_1/9d_s
>>> zurück zur Klassenübersicht

Ausgewählte Themenblöcke

Blog

Projekt

Themenblock: CUBE.CODES (Programmierung)

Fahrenheit=1000;
UI.log((Fahrenheit-32)/1.8);

Hausi: Bei welcher Temparatur in US kocht das Wasser? Ein Programm für die Umkehrfunktion schreiben: Celsius >> Fahrenheit

//Teiler ermitteln
x=3000;
teiler=1;
while(teiler<=x) {
  if(x%teiler==0) UI.log(teiler);
  teiler=teiler+1;
  }
UI.log("bye bye!");
[08:24:31] Program starting ...
[08:24:32] Program running ...
1
43
1181
50783
59077
2540311
69769937
3000107291
bye bye!
[08:25:13] Program finished successfully

Unsere größte Primzahl der Stunde war:

//Teiler ermitteln
x=917471;
teiler=1;
while(teiler<=x) {
 if(x%teiler==0) UI.log(teiler);
 teiler=teiler+1;
 }
UI.log("bye bye!");

>>> CUBE.CODES blank

Gegenteilertrick: 400: 1 2 4 5 8 10 16 20 || 20 25 40 50 80 100 200 400 Wir wollen mit diesem Trick unseren Algorithmus beschleunigen ...

//Teiler ermitteln
x=9174711173;
teiler=1;
while(teiler<=x) {
    if(x%teiler==0) UI.log(teiler);
    teiler=teiler+1;
 }
UI.log("bye bye!");

... dauert fast 5 Minuten:

[11:04:54] Program running ...
1
21991
417203
9174711173
bye bye!
[11:08:29] Program finished successfully

... aber fast 100% der Rechenzeit "verplempern wir" mit Rechnungen jenseits des nötigen (wenn wir bei Wurzel von 9174711173 aufhörenwürden)!

Und so rechnen wir eben nur noch < 1 Minute :-)

//Teiler ermitteln
x=9174711173;
obergrenze=Math.floor(Math.sqrt(x));
UI.log(obergrenze);
teiler=1;
while(teiler<=obergrenze) {
    if(x%teiler==0) UI.log(x+" = "+teiler+" * "+ x/teiler);
    teiler=teiler+1;
}
UI.log("bye bye!");
[11:03:22] Program starting ...
[11:03:23] Program running ...
95784
9174711173 = 1 * 9174711173
9174711173 = 21991 * 417203
bye bye!
[11:03:23] Program finished successfully

Oder noch extremer: 10.000 so groß (so lange) ergibt 5min * 10.000 ist ungefähr einige Wochen ...

//Teiler ermitteln
x=91747111730317;
obergrenze=Math.floor(Math.sqrt(x));
UI.log(obergrenze);
teiler=1;
while(teiler<=obergrenze) {
   if(x%teiler==0) UI.log(x+" = "+teiler+" * "+ x/teiler);
   teiler=teiler+1;
}
UI.log("bye bye!");
[10:56:37] Program starting ...
[10:56:38] Program running ...
9578471
91747111730317 = 1 * 91747111730317
91747111730317 = 181 * 506890120057
bye bye!

... immer noch unter einer Sekunde!

//Teiler ermitteln
//Wir berechnen immer sofort kleine Teiler und Gegenteiler
x=91747111730317;
//Berechne den größtmöglichen kleinen Teiler
obergrenze=Math.floor(Math.sqrt(x));
UI.log(obergrenze);
//Schleife: Test aller Teiler von x
teiler=1;
while(teiler<=obergrenze) {
    if(x%teiler==0) UI.log(x+" = "+teiler+" * "+ x/teiler);
    teiler=teiler+1;
}