Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1152to1156
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

Eine Zahl mit sehr vielen Ziffern

Eine Zahl mit sehr vielen Ziffern
alifa
Hallo VBA Experten,
eine natürliche Zahl a hat die letzte Ziffer eine 2. Wenn man diese von hinten wegnimmt und vorne stellt, ergibt sich die Zahl b, die mit 2 beginnt und dieselbe Ziffernzahl hat. Bedingung b/a=2.
Z.B. a= 10526315702; b=21052631570; b/a=2,000000016. Also stimmt noch nicht ganz. Die Zahl ist noch zu klein. Mein Makro meckert wegen Speichermangel...
Vielleicht hat jemand Spaß daran!
Gruß, Alifa Public Sub Die2V() Dim a, b, c, t!, z%, n# t = Timer a = 1052631570 b = CDec(a & 2) c = CDec(2 & a) n = c / b If n > 2 Then Call weiter Else MsgBox a End If End Sub

Public Sub weiter()
For i = 0 To 8 Step 2
a = a + 10 ^ (Len(a) - 1) + i
b = CDec(a & 2)
c = CDec(2 & a)
n = c / b
If n > 2 Then
Call Die2V
End If
Next
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Eine Zahl mit sehr vielen Ziffern
24.04.2010 08:11:32
BoskoBiati
Hallo,
was willst Du eigentlich erreichen?
Gruß
Bosko
AW: Eine Zahl mit sehr vielen Ziffern
24.04.2010 09:30:48
alifa
Ich suche die Zahl a (die zwischen 15 und 20 Ziffern lang sein soll). Das korrekte Makro ist wichtiger,als die Zahl!
Gruß, Erhard
doppelt geexcelt und makrotisert
24.04.2010 19:51:37
Erich
Hi Erhard,
es war nicht ganz einfach, dein Ziel zu verstehen. Aber wenn das Bildungsgesetz deiner Zahl mal klar ist...
Hier zwei Excellösungen (Formeln von Zeile 3 nach unten kopieren):
Tabelle1

 ABC
1 >= 10* 2
2202
34204
484208
5684216
63684213
773684207
8473684214
99473684209
1089473684218
11789473684217
125789473684215
1315789473684211
14315789473684203
156315789473684206
1626315789473684212
17526315789473684205
180526315789473684210
1910526315789473684201

Formeln der Tabelle
ZelleFormel
A2=C2&A1
A3=C3&A2
B3=--(2*C2>9)
C3=REST(2*C2+B2;10)


Tabelle2

 ABC
1 Rest/ 2
2101
31010
410505
5105212
61052606
710526303
8105263111
91052631515
1010526315717
11105263157818
121052631578909
1310526315789414
14105263157894707
151052631578947313
1610526315789473616
17105263157894736808
181052631578947368404
1910526315789473684202

Formeln der Tabelle
ZelleFormel
A2=A1&C2
A3=A2&C3
B3=REST(C2;2)
C3=KÜRZEN(5*B2+C2/2;)

Und hier zwei Makros, die das auch können:

Option Explicit
Sub ZweierA()
Dim strE As String, zza As Byte, zz As Byte, rr As Byte
zza = 2
While strE = "" Or rr > 0 Or zza  2
strE = zza & strE
zz = zza
zza = (2 * zza + rr) Mod 10
rr = -(2 * zz > 9)
Wend
MsgBox strE
End Sub
Sub ZweierB()
Dim strE As String, zza As Byte, zz As Byte, rr As Byte
zza = 1
While strE = "" Or rr > 0 Or zza  1
strE = strE & zza
zz = zza
zza = Fix(5 * rr + zza / 2)
rr = zz Mod 2
Wend
MsgBox strE
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort - Schönen Sonntag!
Anzeige
AW: doppelt geexcelt und makrotisert
24.04.2010 20:18:24
BoskoBiati
Hallo,
nach meinem Verständnis wäre eher das gefragt:
Option Explicit
Sub Endziffer()
Dim dblZahl As Double
dblZahl = 1000000002
Do Until dblZahl = 999999999999992#
If CDbl("2" & Int(dblZahl / 10)) / dblZahl = 2 Then MsgBox dblZahl
dblZahl = dblZahl + 10
Loop
End Sub

Gruß
Bosko
AW: doppelt geexcelt und makrotisert
24.04.2010 21:49:36
fcs
Hallo an ale Mitstreiter,
bei den Vorgaben mit der 2 vom Ende an den Anfang und b/a = 2 bzw. (b-2*a)=0
müssen alle Lösungen mit 1 beginnen.
Mit roher Gewalt kann man ca. 8 bis 9 Ziffern versuchen zu lösen.
Weitere Lösungen nur durch verwenden bereits gefundener Treffer/Näherungen.
Das Ergebnis ist aber das es bis 15-Ziffern keine Lösungen gibt und dann schlägt die Rechengenauigkeit von Excel zu.
Tabelle4

 ABCD
1ab(b - 2 * a)b/a
21221-31,75000000000000
310221062,05882352941176
41.0522.10512,00095057034221
510.52221.05282,00076031172781
6105.262210.52622,00001900020900
71.052.6322.105.263-11,99999905000038
810.526.31221.052.63172,00000066500024
9105.263.162210.526.316-81,99999992400000
101.052.631.5822.105.263.158-61,99999999430000
11105.263.157.892210.526.315.78952,00000000004750
121.052.631.578.9522.105.263.157.895-91,99999999999145
1310.526.315.789.47221.052.631.578.94732,00000000000029
14105.263.157.894.732210.526.315.789.47392,00000000000009


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Wahrscheinlich gibt es keine Lösung, die als Ergebnis genau 2 für b/a ergibt. Aber das interessiert mich als Nicht-Mathematiker dann auch nicht so sehr.
Hier meine Makros für den Lösungsansatz.
Gruß
Franz
Sub bbTest()
'Reduzierter Rechenaufwand durch Vorgabe der 1. Ziffern aus vorherigen Rechenläufen
Dim a, b, Zeile As Long, i As Integer
Const PotenzMax = 14
Zeile = 1
Do
If (a  "1") _
Or (a > 20000 And Left(CStr(a), 4)  "1052") _
Or (a > 2000000000 And Left(CStr(a), 8)  "10526315") Then
i = i + 1
If i > PotenzMax Then
MsgBox "Fertig" _
& vbLf & "a: " & a & vbLf & "b: " & b, _
vbInformation + vbOKOnly, "Suche die 2"
Exit Do
End If
If a > 2000000000 Then
a = CDec(1.0526315 * 10 ^ i)
ElseIf a > 20000 Then
a = CDec(1.0521 * 10 ^ i)
Else
a = CDec(10 ^ i)
End If
a = Round(a + 2, 0)
Else
a = Round(a + 10, 0)
End If
b = CDec(Right(CStr(a), 1) & Left(CStr(a), Len(CStr(a)) - 1))
If Abs(b - 2 * a)  "1" Then
i = i + 1
If i > PotenzMax Then Exit Do
a = CDec(10 ^ i)
a = Round(a + 2, 0)
Else
a = Round(a + 10, 0)
End If
b = CDec(Right(CStr(a), 1) & Left(CStr(a), Len(CStr(a)) - 1))
If Abs(b - 2 * a) 

Anzeige
kaum Ärger mit der Rechengenauigkeit
25.04.2010 00:26:24
Erich
Hi Franz und Bosko,
zuerst mal eine Frage:
Habt ihr Zweifel daran, dass der String in Zeile 19 meiner Tabellen (und in strE bei den MsgBoxen) eine Lösung ist?
(Franz schreibt ja: "Wahrscheinlich gibt es keine Lösung, die als Ergebnis genau 2 für b/a ergibt.")
Dann noch eine nette Info:
Die Lösung habe ich zuerst mit einem Bleistift und zwei gebrauchten Briefumschlägen
auf der Terrasse sitzend aufgeschrieben, ohne Computer (und ohne Rechenschieber).
Kleinere Probleme mit meiner Hirn-Rechengenauigkeit hatte ich dabei schon - das sieht man auf dem ersten Umschlag.
Deshalb hab ich's aus dem zweiten Umschlag noch mal sauber geschrieben:
Userbild
Später hab ich das in Excel und VBA übertragen.
Bosko, hat dein Makro schon mal ein Ergebnis geliefert? Ich glaube nicht - denn es gibt - bei bis zu 20 Ziffern -
nur das eine. Und dieses Ergebnis hat 18 Stellen. Was soll Excel da noch genau rechnen?
Ja, die Lösung muss natürlich mit 1 beginnen - die Hälfte eben von 2.
Und danach muss eine 0 kommen - die Hälfte von 1 (mit Rest 1).
Und danach muss eine 5 kommen - die Hälfte von 10 (mit Rest 0).
Und so weiter.
Es gibt keine andere Lösung. Und diese lässt sich mit Byte-Variablen - ohne dbl - berechnen.
Für die Darstellung der Lösung reicht ein String mit 18 Zeichen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort und nochmal: Schönen Sonntag!
Anzeige
AW: kaum Ärger mit der Rechengenauigkeit
25.04.2010 04:41:15
alifa
Guten Morgen,
allen Beteiligten ein herzliches Danke. Ich kann mir vorstellen, dass auch eine Lösung mit einer Milliarde Ziffern mit VBA gelöst werden kann, mit dem Datentyp String. Oder habe ich mich jetzt zu weit aus dem Fenster gelehnt? An Erich noch die Bitte, den mathematischen Hintergrund etwas detaillierter zu ergänzen.
Die Zahl stimmt, kann mit dem Rechner des PC's nachvollzogen werden.
Viele Grüße, Erhard
Kaum Mathematik
25.04.2010 12:12:26
Erich
Hi Erhard,
nein, da hast du dich nicht zu weit aus dem Fenster gelehnt. Zitat aus der VBA-Hilfe zu String:
"Zeichenfolgen variabler Länge können bis zu 2 Milliarden (oder 2^31) Zeichen enthalten."
Eine Grenze könnte da auch der PC-Arbeitsspeicher sein.
Zur Anzahl der Lösungen weiter unten.
Die Lösung der Aufgabe Mathematik zu nennen, ist eigentlich nicht angemessen.
Es geht wirklich nur um die Multiplikation einer Zahl mit 2.

a = 1xxxxxxx2 | beginnt mit 1, endet mit 2
b = 2xxxxxxxx | beginnt mit 2,
| ist gleich 2 * a
| Nun ergibt sich schrittweise aus b = 2 * a
b = 2xxxxxxx4 | Die 4 muss da stehen, weil 4 = 2 * 2
| Nun steht auch die vorletzte Stelle von a fest:
a = 1xxxxxx42 |
| Aus b = 2 * a ergibt sich
b = 2xxxxxx84 | Die 8 muss da stehen, weil 8 = 2 * 4
| Nun steht die drittletzte Stelle von a fest:
a = 1xxxxx842 |
| Aus b = 2 * a ergibt sich
b = 2xxxxx684 | Die 4 muss da stehen, weil 16 = 2 * 8
| Den Übertrag 1 von der 16 merkt man sich ("im Sinn")
| Nun steht die viertletzte Stelle von a fest:
a = 1xxxx6842 |
| Aus b = 2 * a ergibt sich
b = 2xxxx3684 | Die 3 muss da stehen, weil 13 = 1 ("im Sinn") + 2 * 6
| Den Übertrag 1 von der 13 merkt man sich ("im Sinn")
| Nun steht die fünftletzte Stelle von a fest:
a = 1xxx36842 |
Wenn man eine Ziffer von b berechnet hat, hat man damit auch eine weitere Ziffer von a bestimmt.
Denn beide bestehen aus den selben Ziffern - nur um 1 Stelle verschoben.
Vielleicht ist das noch klarer, wenn man sich die Zahl a 2 mal untereinander hinschreibt,
darunter dann b als Summe der beiden as:
a = 1xxxxxxx2
a = 1xxxxxxx2
b = 2xxxxxxx4 4 ist 2+2
Daraus: 4 nach oben in a eintragen:
a = 1xxxxxx42
a = 1xxxxxx42
b = 2xxxxxxx4
Daraus: 4en addieren:
a = 1xxxxxx42
a = 1xxxxxx42
b = 2xxxxxx84
Daraus: 8 nach oben in a eintragen:
a = 1xxxxx842
a = 1xxxxx842
b = 2xxxxxx84
Daraus:
a = 1xxxxx842
a = 1xxxxx842
b = 2xxxxx684 (und 1 im Sinn)
Daraus:
a = 1xxxx6842
a = 1xxxx6842
b = 2xxxxx684 (1 ist noch im Sinn)
Daraus:
a = 1xxxx6842
a = 1xxxx6842
b = 2xxxx3684 (eigentlich 2, aber 3 wg. "1 im Sinn", neue 1 im Sinn
Daraus:
a = 1xxx36842
a = 1xxx36842
b = 2xxxx3684 (1 ist noch im Sinn)
usw.
Als Zweifache einer Ziffer können nur Zahlen 0 bis 18 auftreten.
Die 0 kann hier nicht vorkommen (käme nur bei 2*0 raus, dann müsste man also schon mit 0 anfangen).
Bei der Berechnung der Stellen von a (oder b) kommen genau die 18 Teilergebnisse 1 bis 18 raus.
Danach muss sich das Ganze wiederholen - es ist also zyklisch mit Zykluslänge 18.
Damit gibt es dann unendlich viele Lösungen:
105263157894736842
105263157894736842105263157894736842
105263157894736842105263157894736842105263157894736842
105263157894736842105263157894736842105263157894736842105263157894736842
usw.
Das kann man mit VBA machen, muss man aber gar nicht. Geht alles mit Kopfrechnen!
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
deine Lösung bezweifel ich nicht -
25.04.2010 08:29:45
fcs
Hallo Erich,
deine Lösung bezweifel ich nicht - sie stimmt ja auch.
Ich hatte nur keine Lust, mich um das Bildungsgesetzt für die Zahlenreihe zu kümmern.
Dadurch kannst man natürlich die Rechengenauigkeit von Excel umgehen, wobei VBA mit dem Dezimalformat diese Zahlen noch verarbeiten kann, in den Exceltabellen aber bei 15 signifikanten Stellen Schluss ist.
Ohne das Bildungsgesetzt scheitert man bei den großen Zahlen aber an der Rechenzeit.
Gruß
Franz

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige