Arithmetisches Mittel ohne Division

  • Hi, ich habe eine Aufgabe in der ich den Durchschnitt berechnen soll und dabei keine Division verwenden darf.

    Bis jetzt bin ich noch nicht drauf gekommen. Kann mir jemand helfen?

    Die Funktion soll folgendermaßen aussehen:

    Code
    int mid(int a, int b) { ... }
  • 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.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • Zitat von Wolfibolfi

    Wenns nur zwischen zwei Zahlen ist, dann kannst einfach die Summe bilden, und eine Stelle nach rechts shiften.


    Wie soll das gehen? Beispiel 9 und 3:

    9 + 3 = 12

    Eine Stelle nach rechts wäre für mich 1,2 ???

  • 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 gibt

    Danke, das ist natürlich die Lösung!

  • 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.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • 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...

  • 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 k

    System 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

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!