Forum: Mikrocontroller und Digitale Elektronik Dezimalzahl zerlegen in einzelne Zahlen


von Alex A. (Gast)


Lesenswert?

Hallo.
Habe eine vielleicht etwas seltsame Frage.
Ich habe z.B. eine Zahl von 123. (dezimal)
Ich möchte diese Zahl in 1 und 2 und 3 zerlegen.

Mit welcher Formel/Verfahren geht das am besten?
Die zahl kann auch 3, oder 20, oder 3000 sein.

brauche, wie gesagt, einzelne Stellen der Dezimalzahl.

Danke
Gruss Alex S.

von Peter II (Gast)


Lesenswert?

int i = 123;

a = i / 100;
b = (i % 100) / 10;
c = i % 10;

von Alex A. (Gast)


Lesenswert?

was ist, wenn i = 4 ?
Gruss

von Werner (Gast)


Lesenswert?

Alex S. schrieb:
> brauche, wie gesagt, einzelne Stellen der Dezimalzahl.

Meinst du Ziffern?
Teile deine Zahl durch 10. Der Rest ist deine am weitesten rechts 
stehende Ziffer. Das machst du so lange, bis von deiner Zahl nur noch 0 
über ist.

von Peter II (Gast)


Lesenswert?

Alex S. schrieb:
> was ist, wenn i = 4 ?

teste es doch...

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Peter II schrieb:
> was ist, wenn i = 4 ?
>
> teste es doch...

Dadurch, dass nicht mit z.B. 100.0 geteilt wird sondern mit 100, gibt es 
keine "krummen Ergebnisse" 4/100 gibt 0, selbst bei double oder float 
(soweit ich weiss, schlagt mich wenns bei double/float auch ohne Komma 
geht),

von Peter II (Gast)


Lesenswert?

Nils S. schrieb:
> schlagt mich wenns bei double/float auch ohne Komma geht

habe leider vergessen zu schreiben das a,b,c ein int ist. Damit passt 
dort nie ein Komma rein, egal was rechts steht.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Vom int bin ausgegangen.

von Marco M. (Gast)


Lesenswert?

Dürfte ich diesen Thread nochmal aufgreifen, denn der hat mir sehr 
geholfen. Jetzt scheitere ich aber an der Zerlegung einer 4-stelligen 
Zahl. Könnte das bitte noch jemand posten. Dankeschön!

von TU Student 1. (student0)


Lesenswert?

Dieser Code ist für alle bis zu 10 stelligen Ganzzahlen.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
int main()
5
{
6
        long integer = 1234567890;
7
        int digits[10] = { 0 };
8
        int i;
9
10
        printf("De-composing:\n");
11
        for(i = 0; integer != 0; i++)
12
        {
13
                digits[i] = integer % 10;
14
                integer = integer / 10;
15
                printf("Remainder: %ld\n", integer);
16
        }
17
18
        printf("Resulting Digit Array: ");
19
        for(i = 9; i >= 0; i--)
20
        {
21
                printf("(%d)", digits[i]);
22
        }
23
        printf("\n");
24
        return 0;
25
}

Das ist nur schnell hingecoded, ich habe jetzt nicht auf irgendwelche 
Wertebereiche oder ähnliches geachtet.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Christian M. (Gast)


Lesenswert?

Und der Vollständigkeitshalber noch für Stunden/Minuten oder 
Minuten/Sekunden als Mikroelektronika-BASIC-Funktion:
1
sub function s2ms(dim num as word) as byte
2
  digit  = num div 600          '600
3
  por[3] = mask(digit)
4
  digit  = num div 60 mod 10    '60 10
5
  por[2] = mask(digit)
6
  digit  = num div 10 mod 6     '10 6
7
  por[1] = mask(digit)
8
  digit  = num mod 10           '10
9
  por[0] = mask(digit)
10
  result = 0
11
end sub

Gruss Chregu

von asdfasd (Gast)


Lesenswert?

Ich mag ja diese kompakte Variante:
1
static void print_decimal(unsigned i)
2
{
3
    if (i >= 10)
4
        print_decimal(i/10);
5
    putchar('0' + i%10);
6
}

von Peter D. (peda)


Lesenswert?

asdfasd schrieb:
> Ich mag ja diese kompakte Variante:

Kompakt ist daran aber nur der Quelltext.
Der RAM- und CPU-Verbrauch sind es nicht.

Was stört Dich an den Standardfunktionen (itoa, utoa usw.)?

von Vancouver (Gast)


Lesenswert?

Ganz allgemein: Die i-te (i>=1) Ziffer einer ganzen Zahl Z erhält man 
mit z(i) = floor(10*frac(Z/10^i))

Wie Du das effizient implementierst, hängt wesentlich von der 
Programmiersprache ab, aber danach hast Du nicht gefragt :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.