Zusammensetzung einer Zahl

Hallo zusammen.

Ich würde gerne eine Zahl diagnostizieren. Die Art und Weise, wie ich das vorhabe, soll folgendermaßen aussehen:

Man nehme eine beliebige Zahl, z.B. 145

Jetzt möchte ich über diese Zahl wissen, wieviele Hunderter, Zehner und Einer darin enthalten sind. Möglicherweise ist es mathematisch falsch, aber als Ergebnis wünsche ich mir:

Die Zahl enthält 1 Hunderter
Die Zahl enthält 4 Zehner
Die Zahl enthält 5 Einer

Kennt jemand eine mathematische Formel, mit der man das berechnen kann? Ich möchte lieber darauf verzichten, die Zahl in einen Text umzuwandeln und dann die einzelnen „Werte“ wieder in eine Zahl zurückzuwandeln.

Formeln mit Excel-Funktionen würden auch weiterhelfen.
Vielen Dank für Eure Hilfe

VG
Carsten

Hi,

versuch mal das:

Option Explicit

Private Sub Command1\_Click()
 Dim a As long, i As Integer
 Dim e As Integer, l As Integer
 a = 145
 l = Int(Log(a) / Log(10))
 For i = l To 0 Step -1
 e = Int(a / 10 ^ i)
 List1.AddItem CStr(e) & " X " & CStr(10 ^ i)
 a = Int(a Mod 10 ^ i)
 Next
End Sub

Gruß Rainer

Hallo Rainer.

Option Explicit

Private Sub Command1_Click()

Dim a As long, i As Integer

Dim e As Integer, l As Integer

a = 145

l = Int(Log(a) / Log(10))

For i = l To 0 Step -1

e = Int(a / 10 ^ i)

List1.AddItem CStr(e) & " X " & CStr(10 ^ i)

a = Int(a Mod 10 ^ i)

Next

End Sub

Vielen Dank.
Habe es ausprobiert und es funktioniert für 145.
Ich habe dann aber aus der 145 'mal 1458 gemacht und dann wird folgendes Ergebnis zurückgegeben:

1 Tausender
5 Hunderter
6 Zehner
8 Einer

Ich habe nach einigem Testen herausgefunden, dass, sobald die Einer größer 5 sind, werden die Zehner um 1 erhöht. Sobald die Zehner größer als 5 sind, werden die Hunderter um 1 erhöht. Scheinbar läuft diese „Kaskade“ so weiter.

Ich werde 'mal schauen, ob ich herausbekomme, woran das wohl liegt.
Mit „Log“ kenne ich mich nicht wirklich gut aus, aber das wird sich sicherlich finden.

VG
Carsten

Hi,

was hast Du verändert?
Bei mir läuft der Code immer ohne Probleme
Ob ich für a 145 eingebe oder 123456789 oder auch 987654321, es kommt immer das richtige Ergebnis.

Gruß Rainer

Hallo Carsten,

Man nehme eine beliebige Zahl, z.B. 145
Jetzt möchte ich über diese Zahl wissen, wieviele Hunderter,
Zehner und Einer darin enthalten sind. Möglicherweise ist es
mathematisch falsch, aber als Ergebnis wünsche ich mir:
Kennt jemand eine mathematische Formel, mit der man das
berechnen kann? Ich möchte lieber darauf verzichten, die Zahl
in einen Text umzuwandeln und dann die einzelnen „Werte“
wieder in eine Zahl zurückzuwandeln.

warum willst das vermeiden, sags, vielleicht kann man dir dann besser helfen.

Formeln mit Excel-Funktionen würden auch weiterhelfen.

Schau mal hier, bei größeren Zahlen in A1 mußte halt die Formel anpassen, ansonsten ist sie nach untten kopierbar.

Tabellenblatt: C:\Dokumente und Einstellungen\ich2\Eigene Dateien\[ZeichenBilder2.xls]!Tabelle3
 │ A │ B │
──┼──────┼─────────────┤
1 │ 2345 │ 2 Tausender │
──┼──────┼─────────────┤
2 │ │ 3 Hundeterr │
──┼──────┼─────────────┤
3 │ │ 4 Zehner │
──┼──────┼─────────────┤
4 │ │ 5 Einer │
──┴──────┴─────────────┘
Benutzte Formeln:
B1: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Tausender"
B2: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Hundeterr"
B3: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Zehner"
B4: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Einer"

A1:B4
haben das Zahlenformat: Standard

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Gruß
Reinhard

Vielen Dank für Eure Hilfe

VG

Carsten

Hallo,

Man nehme eine beliebige Zahl, z.B. 145

Jetzt möchte ich über diese Zahl wissen, wieviele Hunderter,
Zehner und Einer darin enthalten sind.

kein Problem, das Prinzip ist recht simpel. In der Zahl n sind genau

 (n DIV 10000) MOD 10 Stück Zehntausender
und (n DIV 1000) MOD 10 Stück Eintausender
und (n DIV 100) MOD 10 Stück Hunderter
und (n DIV 10) MOD 10 Stück Zehner
und (n DIV 1) MOD 10 Stück Einer

enthalten. DIV = Ganzzahldivision, MOD = Modulo-Operator. Das kann man natürlich auf weniger Stellen verkürzen oder auf mehr ausdehnen. Alle Werte liegen – wegen des „MOD 10“ am Schluss – immer im Bereich 0…9.

Gruß
Martin

kein Problem, das Prinzip ist recht simpel. In der Zahl n
sind genau

Hallo Martin,

in Excel nur mit Formeln dann so:

Tabellenblatt: C:\Dokumente und Einstellungen\ich2\Eigene Dateien\[ZeichenBilder2.xls]!Tabelle3
 │ A │ B │ C │
──┼─────┼─────────────┼─────────────┤
1 │ 234 │ 0 Tausender │ 0 Tausender │
──┼─────┼─────────────┼─────────────┤
2 │ │ 2 Hundeterr │ 2 Hunderter │
──┼─────┼─────────────┼─────────────┤
3 │ │ 3 Zehner │ 3 10er │
──┼─────┼─────────────┼─────────────┤
4 │ │ 4 Einer │ 4 1ner │
──┴─────┴─────────────┴─────────────┘
Benutzte Formeln:
B1: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Tausender"
B2: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Hundeterr"
B3: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Zehner"
B4: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Einer"
C1: =GANZZAHL(REST($A$1/10^(4-ZEILE());10))&" Tausender"
C2: =GANZZAHL(REST($A$1/10^(4-ZEILE());10))&" Hunderter"
C3: =GANZZAHL(REST($A$1/10^(4-ZEILE());10))&" 10er"
C4: =GANZZAHL(REST($A$1/10^(4-ZEILE());10))&" 1ner"

A1:C4
haben das Zahlenformat: Standard

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Gruß
Reinhard

was hast Du verändert?

Hallo Rainer,

gute Frage, ich glaub Carsten hat kein VB, bzw. ich kenne ihn mehr aus dem Excel-Vba Bereich, wahrscheinlich ging da was bei der Umsetzung schief.

Würde mich aber schon interessieren, was genau, also seinen Test-Code in Vba sehen.

Gruß
Reinhard

Hallo Reinhard,

das muss unter VBA auf der Userform ganz genau so laufen, wie in VB6 auch.
Nur die Steuerelemente heißen anders, das war’s auch schon. Der Rest ist Mathe pur, das macht VBA genauso wie VB6.

Gruß Rainer

Hallo Carsten,

ich habe den Code gerade zur Sicherheit auch noch einmal mit VBA getestet. Das selbe Ergebnis, ich kann den Fehler nicht nachvollziehen.

Hast Du den Code kopiert oder abgetippt?

Gruß Rainer

Hallo Rainer

ich habe den Code gerade zur Sicherheit auch noch einmal mit
VBA getestet. Das selbe Ergebnis, ich kann den Fehler nicht
nachvollziehen.

Hast Du den Code kopiert oder abgetippt?

Ich habe ihn kopiert und dann ein wenig angepasst (für .NET)

VG
Carsten

Hallo Reinhard

In Deinem Beitrag weiter unten hast Du vermutet, dass ich kein VB habe, aber das stimmt nicht. Ich habe VB5 und VB6 bei mir rumliegen, arbeite nur schon länger nicht mehr damit und bin inzwischen auch schon umgestiegen auf VB.NET; das finde ich besser. Mit VBA habe ich „damals“ vor VB5 angefangen, kenne es also länger und habe damit viel gemacht (oder versucht?)

warum willst das vermeiden, sags, vielleicht kann man dir
dann besser helfen.

OK:
Ich „spiele“ gerade mit einer .NET-Programmierung herum, bei der es um eine 7-Segment-Anzeige geht. Ich habe mir für die Segmente Bilder gemalt (jeweils ein Bild für EIN und ein Bild für AUS), die ich entsprechend des „anliegenden“ Signals anzeige. Ich kann also quasi eine Zahl auf einer LED-Anzeige darstellen (sieht hübsch aus).

Die „anliegenden“ Signale speichere ich in einer „Datenbank“ (genauer gesagt in einer Liste, die aus BitArrays besteht). Das heißt, ich habe zehn „Datensätze“(für die Zahlen 0 bis 9) mit jeweils sieben boolschen Werten (für die Segmente a bis g) und muß per nullbasiertem Index auf die Datensätze zugreifen. Ich denke, Du sagst gerade „Ah Ja“ und weißt, daß die Anzahl der Einer in einer Zahl mir dann als Index für den entsprechenden Datensatz dient.

Um es vorwegzunehmen: Ich möchte auf keinen Fall für jede Zahl ein einzelnes Bild malen, was durchaus unproblematisch wäre; ich möchte versuchen, die Steuerung einer 7-Segment-Anzeige zu verstehen.

Weiterhin möchte ich die ganze Geschichte auch noch in einer Klasse kapseln (deswegen muß die mathematische Formel sowohl für die Einer, als auch für die Tausender oder für die Millioner gelten) und irgendwie ein UserControl daraus basteln (krieg’ ich sowieso nie fertig, aber die Vorstellung ist schön).

So, jetzt guck’ ich mir aber erstmal Deine Formeln an. Vielen Dank dafür.

VG
Carsten

Hallo Martin

kein Problem, das Prinzip ist recht simpel. In der Zahl n
sind genau

Simpel ist gut :wink:

(n DIV 10000) MOD 10 Stück Zehntausender

und (n DIV 1000) MOD 10 Stück Eintausender

und (n DIV 100) MOD 10 Stück Hunderter

und (n DIV 10) MOD 10 Stück Zehner

und (n DIV 1) MOD 10 Stück Einer

enthalten. DIV = Ganzzahldivision, MOD = Modulo-Operator. Das
kann man natürlich auf weniger Stellen verkürzen oder auf mehr
ausdehnen. Alle Werte liegen – wegen des „MOD 10“ am Schluss –
immer im Bereich 0…9.

Vielen Dank, Martin, dass werd’ ich auch ausprobieren. Könnte man 1 auch darstellen durch 10 hoch irgendwas?

Jetzt muß ich erstmal 'was futtern.

VG
Carsten

Hallo Martin.

Vielen, vielen Dank.

Das funktioniert super. Ich weiß, es gehört eigentlich nicht hierher, aber falls es von Interesse ist, in .NET sieht es so aus:

Tausender = Math.DivRem(CInt(NumericUpDown1.Value), CInt(10 ^ 4 / 10), Tausender) Mod 10
Hunderter = Math.DivRem(CInt(NumericUpDown1.Value), CInt(10 ^ 3 / 10), Hunderter) Mod 10
Zehner = Math.DivRem(CInt(NumericUpDown1.Value), CInt(10 ^ 2 / 10), Zehner) Mod 10
Einer = Math.DivRem(CInt(NumericUpDown1.Value), CInt(10 ^ 1 / 10), Einer) Mod 10

Durch die Verwendung von 10er-Potenzen bin ich in der Lage, den Divisor anhand der Position der Ziffer innerhalb der Zahl zu bestimmen.

VG
Carsten

Hi Carsten,

Ich habe ihn kopiert und dann ein wenig angepasst (für .NET)

ahhh, .NET …

Da weiß ich dann nicht, was das tut, ob das irgendwo ungefragt rundet.
Mit .NET kenne ich mich gar nicht aus.

Gruß Rainer

Hi Carsten,

Durch die Verwendung von 10er-Potenzen bin ich in der Lage,
den Divisor anhand der Position der Ziffer innerhalb der Zahl
zu bestimmen.

und an den Counter für Deine Schleife kommst Du, indem Du den Exmpnenten ermittelst.

1000 = 10 ^ 3

log(1000) / log(10) = 3

Das ist der teil der Potenzgesetze, der Dir gefehlt hat.

Gruß Rainer

Hallo Rainer

Da weiß ich dann nicht, was das tut, ob das irgendwo
ungefragt rundet.

Mit .NET kenne ich mich gar nicht aus.

Ach so. Naja, ich hatte das Int() ersetzt durch CInt(), weil mir Int als Fehler unterstrichen wurde. CInt() rundet quasi kaufmännisch (wenn man das so sagen kann).

VG
Carsten

In Deinem Beitrag weiter unten hast Du vermutet, dass ich
kein VB habe, aber das stimmt nicht. Ich habe VB5 und VB6 bei
mir rumliegen, arbeite nur schon länger nicht mehr damit und
bin inzwischen auch schon umgestiegen auf VB.NET; das finde
ich besser. Mit VBA habe ich „damals“ vor VB5 angefangen,
kenne es also länger und habe damit viel gemacht (oder
versucht?)

Hallo Carsten,

dann sage das bitte dazu wenn du anfragst.

Wenn du eine VB.Net Lösung suchst kann ich es mir sparen irgendwelche Excelformeln zu basteln und umgekehrt :frowning:

Sag doch bei Anfragen so:
ich hab VB5, VB6, Vb.Net, Excel-Vba, suche eine Lösungg für dieses Problem und ich nehm die Lösung die mir am besten passt.
Dann wissen wir Bescheid.

Nur mal so.

Gruß
Reinhard

Hallo Carsten,

Mit .NET kenne ich mich gar nicht aus.

Ach so. Naja, ich hatte das Int() ersetzt durch CInt(), weil
mir Int als Fehler unterstrichen wurde. CInt() rundet quasi
kaufmännisch (wenn man das so sagen kann).

dann lasse ich das Int eben weg. Das geht auch und sollte mit .NET immer noch funktionieren. / bedeutet Division. \ auch aber ohne Nachkommastellen, ohne runden.

Option Explicit

Private Sub Command1\_Click()
 Dim a As Long, i As Integer
 Dim e As Integer, l As Integer
 a = 123456789
 l = Log(a) \ Log(10)
 For i = l To 0 Step -1
 e = a \ 10 ^ i
 List1.AddItem CStr(e) & " X " & CStr(10 ^ i)
 a = a - e \* 10 ^ i
 Next
End Sub

Gruß Rainer

Hallo Reinhard.,

Wenn du eine VB.Net Lösung suchst kann ich es mir sparen
irgendwelche Excelformeln zu basteln und umgekehrt :frowning:

Irgendwie hast Du schon recht, aber irgendwie auch nicht. Ich suchte nach einer mathematischen Formel. Wenn nun jemand diese Formel kennt, sie aber nur als Excel-Funktion beschreiben kann, dann hilft mir das ja schon weiter und die Umsetzung nach VB oder VB.NET bleibt dann eben mein Problem. Ich weiß aber, daß es für die Mathematik- und Trigonometrie-Funktionen in Excel immer auch eine Entsprechung in VBA gibt und eigentlich heißen die in VB6 auch genauso.

Ich erreiche so doch viel mehr potentielle Helfer.

VG
Carsten