Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
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

Makro für binäre Zahl

Makro für binäre Zahl
alifa
Hallo,
mein Makro soll eine Zahl suchen, die nur aus 1 und 0 besteht. Hat nichts mit binär zu tun.
Option Explicit
'Die gesuchte Zahl ist die kleinste, die restlos durch 225 teilbar ist und
'soll nur aus den Ziffern 1 und 0 bestehen.
Public Sub NurEinsenUndNullen()
Dim Zahl As Variant
Zahl = "1111111111111111111111111110"
Dim L As Variant, n%, m%
For L = 1 To Zahl
For n = 2 To 9
For m = 2 To 27
If Mid(L, m, 1)  n Then
If (CDec(L)) Mod 225 = 0 Then
MsgBox "Treffer bei " & L
Exit Sub
End If
End If
Next
Next
Next
End Sub

Es kann eine große Zahl werden. Die kleineren habe ich schon mit einem anderen Makro getestet. So funktioniert es leider nicht . Kann jemand helfen? Danke im Voraus
Gruß, Erhard

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

Betreff
Benutzer
Anzeige
49382716*225= 11111111100
18.10.2009 16:20:52
ransi
HAllo
Versuch mal so:
Option Explicit


Dim regex

Public Function testen(zahl)
testen = regex.test(zahl)
End Function


Public Sub machs()
Dim L As Variant
Set regex = CreateObject("VbScript.Regexp")
With regex
    .Pattern = "^[01]+$"
    .Global = True
End With
L = 1
Do Until testen(L * 225) = True
    L = CDec(L) + 1
Loop
Debug.Print L; L * 225
End Sub


ransi
Anzeige
AW: 49382716*225= 11111111100
18.10.2009 22:06:52
alifa
Hallo ransi,
danke für Dein Makro. Vielleicht erklärst Du mir das, ich verstehe den Aufbau nicht ganz
Gruß, alifa
AW: Makro für binäre Zahl sehr schnell
18.10.2009 18:17:54
Daniel
Hi
probier mal die Methode
das geht ziemlich schnell, da es im Zehnersystem deutlich weniger Zahlen gibt, die nur aus 2 verschiedenen Ziffern bestehen, als solche, die aus 10 Ziffern bestehen, lohnt es sich, die Schleife über diese Werte laufen zu lassen und nicht über alle möglichen Zahlen
Sub ZahlErmitteln()
Dim Ergebnis As String
Dim i As Long
Do
i = i + 1
Ergebnis = InBinär(i)
If CDec(Ergebnis) / 225 = Int(CDec(Ergebnis) / 225) Then Exit Do
Loop
MsgBox Ergebnis
End Sub

Function InBinär(x) As String
Dim erg As String
Dim i As Long
Dim bin
bin = Array("000", "001", "010", "011", "100", "101", "110", "111")
erg = Oct(x)
For i = 1 To Len(erg)
InBinär = InBinär & bin(Mid(erg, i, 1))
Next
End Function

Gruß, Daniel
Anzeige
AW: Makro für binäre Zahl sehr schnell
18.10.2009 22:12:58
alifa
Hallo Daniel,
Leider verstehe ich das mit dem Array nicht so richtig. Wie kommst Du auf diese 7 Tripel? Kannst Du den Aufbau erklären, wie einem Anfänger halt.
Gruß, Erhard
AW: Makro für binäre Zahl sehr schnell
18.10.2009 23:00:47
Daniel
Hi
naja eigentlich ist es ganz einfach:
anstatt alle Vielfachen von 225 durchzutesten, ob diese nur aus den Ziffern 1 und 0 bestehen, kann ich ja auch alle Zahlen im Dualsystem (die ja nur aus 0 und 1 bestehen) durchtesten, ob deren Äquivalent im Dezimalsystem durch 225 teilbar ist.
und genau das macht mein Makro, ich erzeuge die Zahlenreihe beginnen mit 1, wandle die Zahl in die Binärschreibweise um und prüfe, ob diese Ziffernfolge durch 225 teilbar ist.
leider habe ich in Excel keine funktion gefunden, die ene Zahl vom Dezimalsystem ins Dualsystem umwandelt, daher habe ich die Zusatzfunktion "inBinär" geschrieben, die das macht
Dabei hilft mir, daß es eine Umwandlungsfunktion von Dezimal nach Oktal-Zahl gibt, im Oktalsystem werden die Zahlen mit Ziffern von 0-7 dargestellt.
vom Oktalsystem kann ich relativ einfach ins Binärsystem umwandeln, in dem ich einfach z.B. die Oktalziffer 2 durch die Binärziffernfolge 010 austausche.
dafür verwende ich das Array.
hier zur vedeutlchung die Zahlenreihen im Dezimal, Oktal- und Binärsystem:
Dezimal Oktal Binär
1     1    000 001
2     2    000 010
3     3    000 011
4     4    000 100
5     5    000 101
6     6    000 110
7     7    000 111
8    10    001 000
9    11    001 001
10    12    001 010
11    13    001 011
12    14    001 100
13    15    001 101
14    16    001 110
15    17    001 111
16    20    010 000

ich hoffe, damit ist klar, was passiert.
Gruß, Daniel
ps außerdem sind es 8 Tripel, für die Ziffern 0 - 7 im Oktalsystem
Anzeige
AW: noch ein hinweis:
18.10.2009 19:15:03
Daniel
die Funktion MOD mag keine grossen Zahlen und steigt bei Werten, die grösser als der Datenbereich für LONG sind, aus (2.147.483.648)
wenn du grosse Zahlen erwartest, musst du halt die Klassische Prüfungsmethode verwenden: x/y = Int(x/y)
Gruß, Daniel
Noch ne Lösungsvariante
19.10.2009 00:10:38
Daniel
Hi
hier nochmal ne Lösungsvariante, die zwar nicht ganz so schnell, aber dafür für dich als Anfänger einfacher zu verstehen ist:
Sub Zahlermitteln3()
Dim erg As Double
Dim i As Long
Do
erg = erg + 450
For i = 2 To 9
If InStr(erg, i)  0 Then Exit For
Next
If i = 10 Then Exit Do
Loop
Debug.Print erg
End Sub
Prinzip ist ganz einfach, ich prüfe alle geradzahligen Vielfachen von 225, ob die Ziffern 2-9 enthalten sind.
Ist keine dieser Ziffern enthalten, ist die Lösung gefunden.
Ungeradzahlige Vielfache von 225 enden immer auf 5 und brauchen daher von vorneherein nicht geprüft zu werden. Dadurch lässt sich Anzahl der zu prüfenden Zahlen halbieren, was die Laufzeit der Suche verkürzt.
Gruß, Daniel
Anzeige
900 statt 450
19.10.2009 00:28:10
Erich
Hi Daniel,
statt erg = erg + 450 kannst du schneller erg = erg + 900 verwenden.
Wenn ein Vielfaches von 225 (auch) an den letzten beiden Stellen nur 0 oder 1 haben kann,
müssen die letzten beiden Stellen 00 sein - eine 1 kann da nicht vorkommen.
Also braucht man nur alle Vielfachen des Vierfachen von 225 zu prüfen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: 900 statt 450
19.10.2009 23:29:53
Daniel
Hi
das stimmt natürllich.
noch schneller ist es allerdings, nur die Binärzahlen zu prüfen, ob diese im 10er-System durch 225 teilbar sind, denn das sind deutlich weniger.
gruß, Daniel
Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige