Anzeige
Archiv - Navigation
1108to1112
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Summe Determinanten

Summe Determinanten
alifa
Hallo,
Die Permutationen der Zahlen 1 bis 9 sollen in einem Array gespeichert werden. Das gibt 362880 9-stellige Zahlen(tt). Die einzelnen Ziffern dieser Zahlen sollen der Formel q= entsprechen. Das gibt auch 362880 Werte. Diese sollen dann summiert werden. Ich habe versucht ein Makro(von Erich) anzupassen.
Kann jemand helfen?
Gruß, Erhard

Sub DeterminantenSumme()    ' 362880 Permutationen
Dim zz As Long, arrE(1 To 362880) As String, ii As Integer, pp As Integer
Dim arrV(1 To 10) As Integer, nn As Long, arrW(1 To 362880) As String, q&
Dim a%, b%, c%, d%, e%, f%, g%, h%, i%, s&, t!
t = Timer
Const tt As String = "123456789"
Application.StatusBar = False
Perm tt, "", zz, arrE()
a = Mid(tt, 1, 1)
b = Mid(tt, 2, 1)
c = Mid(tt, 3, 1)
d = Mid(tt, 4, 1)
e = Mid(tt, 5, 1)
f = Mid(tt, 6, 1)
g = Mid(tt, 7, 1)
h = Mid(tt, 8, 1)
i = Mid(tt, 9, 1)
For zz = 1 To 362880
q = a * e * i + (b * f * g) + (c * d * h) - (c * e * g) - (b * d * i) - (a * f * h)
Application.Sum(q) = s
nn = nn + 1
Cells(nn, 1) = s
Application.StatusBar = zz & " / " & arrE(zz)
DoEvents
Next zz
Application.StatusBar = False
MsgBox "Fertig nach " & Round(Timer - t, 2) & " Sekunden"
End Sub
Sub Perm(aa As String, bb As String, Ze As Long, arrX() As String)
Dim ii As Long, jj As Long
jj = Len(aa)
If jj > 1 Then
For ii = 1 To jj
Perm Left(aa, ii - 1) + Right(aa, jj - ii), bb + Mid(aa, ii, 1), Ze, arrX()
Next ii
Else
Ze = Ze + 1
arrX(Ze) = bb & aa
End If
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Summe Determinanten
22.10.2009 19:23:07
Christian
Hallo,
was meinst du genau mit: Diese sollen dann summiert werden.?
Ich verstehe dich wie folgt:
1: 123456789: q=0: Summe=0
2: 123456798: q=9: Summe=9
3: 123456879: q=-9: Summe=0
4: 123456978: q=-9: Summe=-9
5: 123456897: q=9: Summe=0
6: 123456987: q=0: Summe=0
7: 123457689: q=7: Summe=7
8: 123457698: q=15: Summe=22
9: 123458679: q=7: Summe=29
10: ...
Summe ist also die Gesamtsumme aller q.
dann bekommst du nach den besagten 362880 Durchläufen als Ergebnis: Summe=0
Gruß
Christian
AW: Summe Determinanten
23.10.2009 05:13:15
alifa
Hallo,
Genau diese Summe habe ich gesucht. Mir ging es mehr um das Makro. Mein "Office Home and Student 2007 kann nur etwas über 65000 Zeilen berechnen, dann ist Ende. Mittlerweile hatte ich ein Makro. Doch das braucht halt mindestens diese 362880 Zeilen. Die Summe wollte ich anschließend mit Excel finden. Also =Summe(C1:C362880). Oder hast Du das mit einem einfacheren Makro herausgefunden, das Ergebnis: 0 ?
Gruß, Erhard
Anzeige
AW: Summe Determinanten
23.10.2009 20:06:21
Christian
Hallo Erhard,
du brauchst ja nicht die ganzen Zwischenergebnisse in 'ne Tabelle schreiben um anschließend hier die Summe zu bilden. Bilde die Summe direkt.
Hier mein Beispielcode.
Gib mir Bescheid, wie du damit zurecht kommst.
Gruß
Christian

Option Explicit
Sub DeterminantsSum()
Dim intPtrn%(8), lngRes&
Call PermSum(intPtrn, 0, 1, -1, lngRes)
MsgBox lngRes
End Sub
Sub PermSum(intPtrn%(), i As Byte, lngCnt&, lngPos&, lngSum&)
Dim j As Byte
lngPos = lngPos + 1
intPtrn(i) = lngPos
If lngPos = UBound(intPtrn) + 1 Then
lngSum = lngSum + _
intPtrn(0) * intPtrn(4) * intPtrn(8) + _
intPtrn(1) * intPtrn(5) * intPtrn(6) + _
intPtrn(2) * intPtrn(3) * intPtrn(7) - _
intPtrn(2) * intPtrn(4) * intPtrn(6) - _
intPtrn(1) * intPtrn(3) * intPtrn(8) - _
intPtrn(0) * intPtrn(5) * intPtrn(7)
lngCnt = lngCnt + 1
Else
For j = 0 To UBound(intPtrn)
If intPtrn(j) = 0 Then Call PermSum(intPtrn, j, lngCnt, lngPos, lngSum)
Next
End If
lngPos = lngPos - 1
intPtrn(i) = 0
End Sub

Anzeige
AW: Summe Determinanten
24.10.2009 08:00:05
alifa
Hallo Christian,
Einiges verstehe ich nicht. Z.B: Call PermSum(intPtrn, 0, 1, -1, lngRes)
Habe mich natürlich über Dein Makro gefreut, da ich schon seit Längerem, so etwas gesucht hatte, um die Summe direkt zu bilden. Wenn Du es im Einzelnen erklären könntest...Dann möchte ich das nächste, ähnliche Problem lösen: Die Summe aller Quersummen der Zahlen von 1 bis 1000000, deren Quersumme einstellig ist.
Z.B. Quersumme von 111111(=6), 211111(=7), 212211(=9) Die größte Zahl ist eigentlich 810000. Dann wären das schon 2 Makros mit dem selben Thema, quasi das Thema von 2 Seiten beleuchtet!
Gruß, Erhard
Anzeige
AW: Summe Determinanten
24.10.2009 09:17:04
Christian
Moin,
PermSum ist eine rekursive Prozedur (ruft sich also immer wieder selbst auf).
Rekursionen sind schon etwas tricki - da muss man sehr genau aufpassen.
Diese Prozedur ermittelt jede Permutation für die Ziffern 1 bis 9 und schreibt diese in das Array intPtrn (Pattern im Sinne von Kombinations-Muster). Aus den Werten dieses Array wird dann das Ergebnis deiner "q-Formel" berechnet und zur Variablen lngSum hinzu addiert. Ich hab also kein Array mit 362880 Einträgen sondern nur mit 9 des jeweiligen Musters.
Das ist eigentlich alles, aber irgendwie muss ich das Teil ja starten. Da passiert mit dem Aufruf:
Call PermSum(intPtrn, 0, 1, -1, lngRes) mit den entsprechenden Startwerten.
Auf "lngCnt" kann man verzichten, dass ist ein Überbleibsel von der Entwicklung.
Statt "PermSum" finde ich den Namen "Perm" geeigneter, du hattest diesen aber schon in deinem Beispielcode verwendet.
ist es jetzt etwas klarer?
Grüße
Christian
Anzeige
AW: Summe Determinanten
24.10.2009 11:26:09
alifa
Hallo,
Warum 0,1,-1 ?
Um das mit der Summe besser zu verstehen:
Sub Einfach()
Dim n&, a&, b&, c&, z&, lngRes&, t!
t = Timer
For n = 1 To 1000000
a = Quersumme(n)
b = Quersumme(a)
c = Quersumme(b)
If a lngRes = Sum(a) + Sum(b) + Sum(c)
MsgBox lngRes
End If
Next
End Sub

Public Function Quersumme(ByVal Zahl As Long) As Long
Dim nQuersumme As Long
Do While Zahl  0
nQuersumme = nQuersumme + (Zahl Mod 10)
Zahl = Zahl \ 10
Loop
Quersumme = nQuersumme
End Function

Wie sieht hier die Prozedur für die Summe aus, so dass diese direkt ermittelt wird, wie gehabt, ohne Tabelle?
Gruß, Erhard
Anzeige
AW: Summe Determinanten
24.10.2009 12:11:40
Christian
Warum 0,1,-1 ?
"i" ist am Anfang 0. Da keine Referenz auf "i" benötigt wird, wird der Zahlenwert übergeben.
Genauso bei "lngPos": hier wird mit -1 gestartet, da lngPos schon beim ersten Eintritt um 1 erhöht wird.
"lngCnt" ist wie gesagt nicht relevant - kannst'e rausschmeißen.
Lass das Script doch mal in Einzelschritten durchlaufen und schau dir die Werte der Variablen an. Da siehst du schnell, was passiert.
Mit deiner Quersumme hab ich mich jetzt nicht näher beschäftigt. Aber probier mal:
lngRes = lngRes + a + b + c
statt:
lngRes = Sum(a) + Sum(b) + Sum(c)
Gruß
Christian
Anzeige
AW: Summe Determinanten
24.10.2009 15:10:43
alifa
Danke!
Erhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige