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.
int i = 123; a = i / 100; b = (i % 100) / 10; c = i % 10;
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.
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),
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.
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!
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.
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
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 | }
|
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.)?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.