1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Arithmetisches Mittel ohne Division

  • eds
  • 1. Mai 2006 um 18:00
  • Unerledigt
  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 1. Mai 2006 um 18:00
    • #1

    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) { ... }
  • lj_scampo
    8
    lj_scampo
    Mitglied
    Reaktionen
    2
    Punkte
    557
    Beiträge
    110
    • 1. Mai 2006 um 18:11
    • #2

    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

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 1. Mai 2006 um 18:12
    • #3

    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.

  • lj_scampo
    8
    lj_scampo
    Mitglied
    Reaktionen
    2
    Punkte
    557
    Beiträge
    110
    • 1. Mai 2006 um 18:14
    • #4

    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]

  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 1. Mai 2006 um 18:15
    • #5
    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 ???

  • lj_scampo
    8
    lj_scampo
    Mitglied
    Reaktionen
    2
    Punkte
    557
    Beiträge
    110
    • 1. Mai 2006 um 18:16
    • #6

    rechne das ganze mal im binaersystem, dann stimmts wieder

  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 1. Mai 2006 um 18:16
    • #7
    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!

  • Kornuun
    4
    Kornuun
    Mitglied
    Punkte
    140
    Beiträge
    28
    • 2. Mai 2006 um 15:10
    • #8

    Nur so ne Frage, ist das nicht eigentlich das gleiche wie durch 2 zu dividieren? Ich dachte das sollst du nicht verwenden?

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 2. Mai 2006 um 16:06
    • #9

    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.

  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 2. Mai 2006 um 23:35
    • #10

    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
    public 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);	
    
    	}
    
    }
    Alles anzeigen
  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 2. Mai 2006 um 23:57
    • #11

    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!

  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 5. Mai 2006 um 09:32
    • #12

    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!

  • lj_scampo
    8
    lj_scampo
    Mitglied
    Reaktionen
    2
    Punkte
    557
    Beiträge
    110
    • 5. Mai 2006 um 22:45
    • #13

    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

  • eds
    3
    eds
    Mitglied
    Punkte
    75
    Beiträge
    12
    • 8. Mai 2006 um 02:23
    • #14

    Danke! Habe den Code nun fertig und alles funktioniert einwandfrei! THX

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung