Arithmetisches Mittel ohne Division
-
-
eine mehtode waere, du zaehlst solange jeweils zur kleineren zahl eins dazu und von der groesseren zahl eins weg, bis sich die zaehler treffen oder sich nur mehr um 1 unterscheiden. dann hast du das mittel ohne division.
sehr effizient ist das ganze allerdings nicht, ka. obs da gute mehtoden ohne division gibt -
Wenns nur zwischen zwei Zahlen ist, dann kannst einfach die Summe bilden, und eine Stelle nach rechts shiften.
-
verflixt, stimmt! an shift dachte ich gar nicht mehr als erstatz fuer division durch 2^n
[edit]aber kein wunder, wolfi ist ja auch schon dipl ing und ich erst bakk :p[/edit]
-
-
rechne das ganze mal im binaersystem, dann stimmts wieder
-
Zitat von lj_scampo
eine mehtode waere, du zaehlst solange jeweils zur kleineren zahl eins dazu und von der groesseren zahl eins weg, bis sich die zaehler treffen oder sich nur mehr um 1 unterscheiden. dann hast du das mittel ohne division.
sehr effizient ist das ganze allerdings nicht, ka. obs da gute mehtoden ohne division gibtDanke, das ist natürlich die Lösung!
-
Nur so ne Frage, ist das nicht eigentlich das gleiche wie durch 2 zu dividieren? Ich dachte das sollst du nicht verwenden?
-
Ist Auslegungssache. Wenn es Aufgabe ist, das irgendwie mit Additionen hinzubiegen, zählt shiften wohl als dividieren.
Ich musste mal für einen Microchip programmieren, der konnte nicht dividieren, also musste ich ohne auskommen. Shiften konnte er, also hab ichs natürlich verwendet.
Ist immer die Frage, ob man krampfhaft etwas nicht verwenden darf, oder obs dafür nen Grund gibt.
-
Hi! Also die Aufgabenstellung ist:
"Erlaubt: a++, a--, a==b, a>b. Entwickeln Sie eine nicht rekursive Funktion mid (a, b), die für die übergebenen Zahlen das abgerundete arithmetische Mittel berechnet. Mit Hilfe von mid(a, b) soll eine rekursive Funktion mid(arr[]) implementiert werden, welches für das übergebene Array arr[], welches immer eine größe von m =2k (k Element N), das abgerundete a. Mittel der Zahlen im Array berechnet."
Verwenden darf man noch "if else", "while" sowie Zuweisungen und bool'sche Operationen (!, &&, ||).Hier meine implementierung bis jetzt. Klappt aber irgendwie nur mit Arrays aus den 2er Potenzen...
Code
Alles anzeigenpublic class arithM { public static int mid(int a, int b) { int schnitt; int klein; int gross; /* * Variable deklarieren. */ if (a == b) { // Falls a = b ist das Ergebnis trivial. schnitt = a; //System.out.println(schnitt); return schnitt; } if (a > b) { // Parameter werden nach größe geordnet. gross = a; klein = b; } else { // Parameter werden nach größe geordnet. gross = b; klein = a; } while (gross - klein > 1) { /* * Solange eine Differenz zwischen beiden Variablen besteht * wird die kleine Variable um 1 erhöht und die große um 1 * reduziert. */ klein++; gross--; } schnitt = klein; System.out.println(schnitt); return schnitt; } public static int mid(int[] arr) { int laenge; laenge = arr.length; if (laenge == 2) { System.out.println( mid(arr[0], arr[1]) ); return mid(arr[0], arr[1]); } else { int haelfte = mid(laenge, 0); int[] new_arr = new int[haelfte]; int k = 0; int i = 0; while (haelfte < laenge) { new_arr[i++] = mid(arr[k++], arr[k]); k++; haelfte++; } mid (new_arr); } return 0; } public static void main(String[] args) { System.out.println("Funktion 1"); //System.out.println( mid(111, 6) ); mid(111, 6); System.out.println(""); System.out.println("Funktion 2"); int[] array = {1000, 1000, 1000, 1000, 0, 0, 0, 0}; // Array mit 8 Werten. mid(array); } }
-
OMG! Da hat eben das ganze Forum gesponnen und ich Depp versuch als meinen Post zu retten und jetzt ist er 1000 mal hier! Großes Sorry und eine Bitte an den Admin, einfach den letzten post stehen zu lassen!
-
Ich bins noch mal. Es ist in Ordnung wenn der Code nur mit 2^k (k € N) funktioniert.
Kann mir jemand sagen wieso ich mir das Ergebnis per System.out in der mid(int[] arr] Funktion anzeigen lassen kann, jedoch nicht in der Main wenn ich: System.out.print( mid(array) ); mache?
Danke
Wieso muss ich eigentlich immer noch return 0 da stehen haben? In diesen Fall dürfte er nie kommen, doch wegmachen geht nicht!
-
hi!
zuerst mal finde ich folgende codezeile recht unsicher:
new_arr[i++] = mid(arr[k++], arr[k]);
ich glaube, man sollte sich nicht darauf verlassen, dass der compiler und die vm den code von "hinten aufrollen". was passiert, wenn zuerst arr[k++] und danach arr[k] eingesetzt werden: du schickst in dem fall 2mal den selben arraywert in deine mid-mehtode (ganz so, als würde auf deinem system die zeile new_arr[i++] = mid(arr[k], arr[k++]); lauten)
ich wuerde das umbauen auf z.b. new_arr[i++] = mid(arr[k+1], arr[k]); mit folgender doppel-incrementierung von kSystem out: wenn deine mid(int[] arr) - methode in den else-zweig faellt, lieferst du keinen rückgabewert (return). aus dem grund wird diese methode bei uebergabe eines arrays mit länge!=2 immer 0 liefern, auch wenn sie richtig rechnet.
@da muss return 0 stehen: der selbe grund wie bei System out. im elsezweig gibts kein return, da die mehtode aber einen rückgabewert besitzt, muss irgendwann mal ein return zum zuge kommen
-
Danke! Habe den Code nun fertig und alles funktioniert einwandfrei! THX
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!