Rechenaufgabe

Dieses Thema im Forum "Member Talk & Offtopic" wurde erstellt von Floh1111, 12.02.2009.

  1. #1 Floh1111, 12.02.2009
    Floh1111

    Floh1111 Realist

    Dabei seit:
    06.06.2006
    Beiträge:
    701
    Zustimmungen:
    0
    Ort:
    Oldenburg (Niedersachsen)
    Hoi!

    Mein Vater und ich sind gestern Abend an einer Aufgabe gescheitert, die ich für ein Rechtesystem benützen möchte. Daher wollte ich mal fragen, ob ihr das nicht vielleicht wisst. Ich bin nicht so das Mathe Ass...

    Gegeben ist eine Summe die nach folgendem Muster erstellt wird:
    (2^a)+(2^b)+(2^c)+...+(2^z) = Summe

    Ich kenne nur die Summe und soll Prüfen ob bei der Erstellung der Exponent X benutzt wurde. Jeder Exponent kann max. 1x auftauchen.

    Beispiel:
    Summe: 43
    Exponent: 5
    Ergebnis: True

    Ergebnis ist True, da die Summe aus (2^0)+(2^1)+(2^3)+(2^5) erstellt wurde und damit unter anderen 5 als Exponent zum Bilden der Summe benutzt wurde.

    Das ganze will ich nachher in Php implementieren, brauche aber nur einen Lösungsweg, die Implementierung sollte ich hinbekommen. Es sei denn jemand hat direkt so eine Implementierung parat oder einen Tipp für mich, wo ich so etwas finde.

    Danke
    Floh1111
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Graf_Ithaka, 12.02.2009
    Zuletzt bearbeitet: 12.02.2009
    Graf_Ithaka

    Graf_Ithaka Routinier

    Dabei seit:
    29.01.2005
    Beiträge:
    487
    Zustimmungen:
    0
    Ort:
    Steiermark nahe Graz
    Ich hab jetz keine Implementierung parat aber ich würd so rangehn, dass ich die eingelesene Zahl in Binärrepräsentation betrachte und wenn an Stelle x eine 1 steht dann wurde x als Potenz verwendet, wenn 0 steht, dann nicht.

    MfG,
    Graf_Ithaka

    EDIT:
    Ne kleine Beispielimplementation in C, was ich mir gedacht hab, gibt sicher ne schönere und schnellere Methode ;)

    Code:
    #include <stdio.h>
    
    int i,in,mod,pot;
    
    int main()
    {
    
    scanf("%d", &in);
    scanf("%d", &pot);
    
    printf("in: %d\n", in);
    
    for (i = 32; i > 0; i--) {
    	mod = in % 2;
    	in /= 2;
    
    	if ( (i = (32-pot)) & (mod = 1) )
    	{
    		printf("%d is true\n", pot);
    		return 0;
    	}
    	else
    	{
    		printf("%d is false\n", pot);
    		return 0;
    	}
    
    }
    return 0;
    
    }
    
     
  4. #3 marcc, 12.02.2009
    Zuletzt bearbeitet: 12.02.2009
    marcc

    marcc Tripel-As

    Dabei seit:
    19.07.2007
    Beiträge:
    247
    Zustimmungen:
    0
    Ort:
    Traunstein, D
    hmm.. alleine um rauszufinden ob 43 ein ergebnis liefert müsste man durch probieren 500 möglichkeiten durchrechnen ;)

    2^6 > 43 > 2^5 => 6 kann als exponent nicht mehr vorkommen..

    also alle möglichkeiten berechnen..

    (5 über 2)* .. *(5 über 5) = 500
     
  5. #4 Floh1111, 12.02.2009
    Zuletzt bearbeitet: 12.02.2009
    Floh1111

    Floh1111 Realist

    Dabei seit:
    06.06.2006
    Beiträge:
    701
    Zustimmungen:
    0
    Ort:
    Oldenburg (Niedersachsen)
    @marcc: das ist aber nicht sehr performant. Das mit der Binärumrechnung geht glaube ich schon in die richtige Richtung. Den Ansatz das über diese Potenzen zu machen habe ich aus einem Anderen System, das ich allerdings gerade nicht parat habe und dort die Lösung auch nicht ganz nachvollziehen konnte. Darum frage ich hier. Wenn ich mich recht entsinne wurde das dort auch mit Binärumrechnung gelöst.

    Nochmal zu der Binärumrechnung.
    Was ist denn die erste stelle bei der Binärzahl? Also welche stelle prüfe ich, wenn ich als Exponent 0 prüfen soll?

    //Edit:@Graf_Ithaka: Ich schreibe deinen Code mal in Php...

    Bye
    Floh1111
     
  6. #5 Gott_in_schwarz, 12.02.2009
    Zuletzt bearbeitet: 12.02.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Das ist sehr trivial. Du kannst jede Zahl als Summe von 2er Exponenten darstellen. Nennt sich binäres Zahlensystem ;)
    Wenn der Exponent nicht der größte Exponent sein muss, musst du tatsächslich nur prüfen, ob der Exponent in der Zahl gesetzt ist, also
    Code:
    zahl & (1 << exponent)
    Wenn der Exponent der größte mögliche Exponent sein soll, musst du nur noch zusätzlich testen, ob größere Exponenten gesetzt sind:
    Code:
    (! (zahl & (~ ((1 << (exponent+1)) - 1)))) && (zahl & (1 << exponent))
    Ein paar Klammern kann man sicherlich weglassen ;)

    edit: mal am Beispiel 43:
    in Binär 101011
    ((1 << (exponent + 1)) - 1) ist dann 2^6 - 1, also
    111111
    Die binäre Negation davon wäre also
    Code:
    ~ ...0000000000000000111111 ==
      ...1111111111111111000000
    Also alle 2er Exponenten gesetzt außer 2^0 .. 2^5.

    edit: arg, Klammern. Naja, in "richtigem Code" würde ich das in Teilausdrücke aufsplitten. Oder schön indentieren. Bei der prescendence von diesen Operatoren bin ich mir nie so sicher, deswegen die überschwengliche Klammerung.
     
  7. #6 Graf_Ithaka, 12.02.2009
    Zuletzt bearbeitet: 12.02.2009
    Graf_Ithaka

    Graf_Ithaka Routinier

    Dabei seit:
    29.01.2005
    Beiträge:
    487
    Zustimmungen:
    0
    Ort:
    Steiermark nahe Graz
    Also ich bins so angegangen, dass ich mir die Zahl einfach durch modulo 2 auf die Teilbarkeit mit 2 überprüft hab und dann durch 2 dividiere, dann wird erneut weiterversucht.
    Auf die Methode bekommst du die Zahl (in meinem Fall nen 32bit integer, Achtung!) in Binär, nur eben verkehrt herum was für die Überprüfung kein Problem is, wir ziehn einfach die Stelle von 32 ab und haben unsren Wert.

    Halt dir einfach vor Augen wie du von Binär auf Dezimal kommst..

    Binär 110101 ist in Dezimal 2^0 + 2^2 + 2^4 + 2^5 = 53
    Von hinten beginnend die Summe der Terme wo eine 1 steht, zur Basis 2 bilden und als Exponent verwemdest du die x-te Stelle.

    MfG,
    Graf_Ithaka

    EDIT: Die schnellere und schönere Methode siehe Bsp von Gott_in_Schwarz ;)
     
  8. #7 Floh1111, 12.02.2009
    Floh1111

    Floh1111 Realist

    Dabei seit:
    06.06.2006
    Beiträge:
    701
    Zustimmungen:
    0
    Ort:
    Oldenburg (Niedersachsen)
    Ich habs :)
    Hatte von vorne und nicht hinten geprüft.

    Das ist ja wirklich simpel wenn man das weiß.
    Warum lernt man in der Schule eigentlich nicht mit dem Binärsystem umzugehen?

    Ich habe jetzt die Summe in eine Binärzahl umgewandelt (In Php gibt es dazu decbin()) und prüfe jetzt einfach ob an Xter stelle von hinten eine 1 steht.

    Danke euch
    Floh1111
     
  9. #8 Graf_Ithaka, 12.02.2009
    Graf_Ithaka

    Graf_Ithaka Routinier

    Dabei seit:
    29.01.2005
    Beiträge:
    487
    Zustimmungen:
    0
    Ort:
    Steiermark nahe Graz
    Gratuliere :)

    Also ich hab das seinerzeit in der Schule noch in Physik gelernt.

    MfG,
    Graf_Ithaka
     
  10. marcc

    marcc Tripel-As

    Dabei seit:
    19.07.2007
    Beiträge:
    247
    Zustimmungen:
    0
    Ort:
    Traunstein, D
    stimmt da war mal was..

    43 = 1 * 2^5 + 11
    11 = 0 * 2^4 + 11
    11 = 1 * 2^3 + 3
    3 = 0 * 2^2 + 3
    3 = 1 * 2^1 + 1
    1 = 1 * 2^0 + 0

    => 43 = (101011)_2
     
  11. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  12. daboss

    daboss Keine Macht für niemand!

    Dabei seit:
    05.01.2007
    Beiträge:
    1.294
    Zustimmungen:
    0
    Ort:
    sydney.australia.world
    Mathe, 5. Klasse (bayr. :P) Gymnasium. Nur hat einem da noch keiner erzählt, für was sowas gut sein soll... (ausser "Pferde könnten so zählen" oder irgendwie so :headup:)
     
  13. #11 Gott_in_schwarz, 12.02.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Das geht auch ganz ohne ominöse decbin() Funktionalität. Einfach mit bitwise operators.
    Schaustu hier.
     
Thema:

Rechenaufgabe

Die Seite wird geladen...

Rechenaufgabe - Ähnliche Themen

  1. Eine Kleine Rechenaufgabe

    Eine Kleine Rechenaufgabe: Aufgabe: Eine Mutter ist 21 Jahre älter als ihr Kind und in 6 Jahren wird das Kind 5 mal jünger sein, als die Mutter. Frage: Wo ist der Vater?...