Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Summe =X, Kehrwert =1

Diskussion: Summe =X, Kehrwert =1 im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Also, die Summe einer Menge positiver, ganzer Zahlen soll X ergeben. Die Summe der Kehrwerte=1 (Kehrwert von Zahl Y ist ...

Antwort
Alt 07.05.09, 22:16   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard Summe =X, Kehrwert =1


Also, die Summe einer Menge positiver, ganzer Zahlen soll X ergeben. Die Summe der Kehrwerte=1 (Kehrwert von Zahl Y ist 1/Y -> also z.B Kehrwert von 4 ist 1/4). Dabei ist es egal, wie viele Zahlen man nimmt oder ob sie sich wiederholen.
Bsp:
X=10:
[4,2,2]
4+4+2=10
1/4+1/4+1/2=1
X=20:
[6,6,6,2]
6+6+6+2=20
3/6+1/2=1/2+1/2=1

Schreibe ein Programm, welches die Lösung für für X berechnet.
Gib eine Lösung für X=200 an.
Optional: für X=2008 (kann etwas länger dauern ;) ).

__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 07.05.09, 23:19   #2 (permalink)
 
Registriert seit: 23.03.05
xblax Leistung: 8086
Likes: 19
Standard

Nur ganzzahlige Lösungen nehme ich an?
Dann müsste man also damit leben, dass es nicht für alle Zahlen eine Lösung gibt.

Mit Brüchen wärs glaub ich einfacher
xblax ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 07.05.09, 23:27   #3 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard

Zitat:
Nur ganzzahlige Lösungen nehme ich an?
Jep.
Zitat:
Dann müsste man also damit leben, dass es nicht für alle Zahlen eine Lösung gibt.

Mit Brüchen wärs glaub ich einfacher
Das Leben ist hart und ungerecht
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 19.06.09, 16:13   #4 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

Python
Code:
def suminverse(n, rs=set(), xs=[]):
    if sum(xs) == n and sum(map(lambda x: 1.0/x, xs)) == 1:
        rs.add("%i -> %s" % (n, sorted(xs)))
        return rs
    elif sum(xs) > n:
        return
    for i in range(2, n/2+1):
        if suminverse(n, rs, xs+[i]):
            return rs

for r in suminverse(9): print r
Vielleicht ist das ja ein Anreiz für einige Leute, den Code zu optimieren.
Einige Optimierungsmöglichkeiten kann man recht schnell erkennen, wenn man sich die Ergebnisse anschaut, die für kleinere Zahlen ausgegeben werden q0]

Gruß
Felix
Ook! ist offline   Mit Zitat antworten
Alt 12.09.09, 00:36   #5 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

Geht es darum nur eine Lösung zu finden? Oder die kürzesten? Oder alle?

Gibt es eine Lösung die nicht auf stupides brute-force setzt? (Also wo alle Lösungen für 200 in wenigen Minuten berechnet werden können.)
lagalopex ist offline   Mit Zitat antworten
Alt 12.09.09, 01:44   #6 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard

Zitat:
Original von lagalopex
Gibt es eine Lösung die nicht auf stupides brute-force setzt? (Also wo alle Lösungen für 200 in wenigen Minuten berechnet werden können.)
Ich habe die Aufgabe damals nur als 4 Zeilen PoC umgesetzt (BF Methode, um an ein paar gültige X Werte für die Aufgabenstellung zu kommen).

Aber afaik ja, es sollte eine bessere Lösung als BF geben (bitte auf das Datum achten, hab die Details nicht mehr so richtig im Kopf ).

Sonst: ob Du nun alle oder nur die kürzesten ermittelst bleibt Dir überlassen. Die Aufgabenstellung gibt ja nur eine Schranke nach "unten" vor
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 23.04.10, 15:00   #7 (permalink)
 
Registriert seit: 21.04.10
raorao Leistung: Facit NTK
Likes: 0
Standard Effizient...

Möglich, dass der Code noch viel schöner geschrieben werden könnte, aber in Sachen Effizienz wohl kaum schöner möglich...
Das Ergebnis für 200 wird in einigen Millisekunden und jenes für 2008 innerhalb einer Sekunde berechnet. Die Tatsache, dass die Zahlen immer "recht" nahe um die Wurzel von X liegen und die Intervalle zwischen diesen Zahlen den grössten Teiler von X (wobei Teiler kleiner Wurzel X sein muss) betragen, lassen sich für jedes beliebige X möglichst effiziente Voreinstellungen treffen, die meist innert sehr kurzer Zeit zum Ergebnis führen. Bin gespannt auf andere Lösungsansätze... Würde mich sehr interessieren, wie man diese Aufgabe ohne Rekursion lösen könnte!?

Python Code:
Code:
import math
import time


def neueZiffer(ziel, start = 2, intervall = 1, anfangszeit = time.time(), liste = []):
    s = 0
    for zahl in liste:
        s += 1/float(zahl)

    for i in xrange(start , int(1.3 * math.sqrt(ziel)), intervall):
        if s + 1/float(i) < 0.9999999:
            neueZiffer(ziel, i, intervall, anfangszeit, liste + [i])
        elif s + 1/float(i) > 0.999999 and s + 1/float(i) < 1.0000001:
            kompl = liste + [i]
            summe = 0
            for z in kompl:
                summe += z
            if summe == ziel:
                print ziel
                print kompl
                print "Zeit seit Programmstart: %.2f Sekunden" % (time.time() - anfangszeit)

neueZiffer(200,10,5)
print
neueZiffer(2008, 32, 8)
print "Programmende"
raorao ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Summe =X, Kehrwert =1
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61