Ziffern einer Zahl auslesen


#1
Hallo,

ich brauche eine Zahl (long int) in seine Ziffern zu zerlegen. Wie mache ich das am Besten? Die Beiträge in diesem Forum dazu, habe ich gelesen. Gibt es keinen anderen Weg als das integer in ein string umzuwandeln usw.. ?



PS: Die Aufgabe, die ich versuche zu lösen ist ziemlich einfach: Ich will alle Zahlen zwischen 0 und 1000 durchgehen, und überprüfen ob sie sich als die Summe der Faktoriellen der einzelnen Ziffer darstellen lassen. Also so was wie: xyz =?= x! + y! + z!
Beispiel: 145 = 1! + 4! + 5!

Vielen Dank für Eure Hilfe im voraus

artacademy
 

SGSSGene

Erfahrenes Mitglied
#2
Bin mir nicht sicher, es sollte mit Hilfe des Modulo operator gehen.
z.B. so
ein wenig Pseudocode der es veranschauen soll:
Code:
zahl = 254 //Die Zahl die Zerlegt werden soll.
temp = zahl % 10 // Es bleibt 4 übrig
z1 = temp;

zahl = zahl - temp; //Hier steht nun 250
temp = zahl % 100 // es bleibt 50 übrig, um diese nun zu verwenden könnte man einfach durch 10 teileb
z2 = temp / 10;

zahl = zahl - temp; //Hier steht nun 200
temp = zahl % 1000; // Es bleiben 200 übrig, durch 100 teilen um diese Zahl zu verwenden.
z3 = temp / 100;
Nun stehen in z1 - z3 die einzelnen Ziffen.

mfg
Gene
 
#3
Gene hat recht... wenn du mit Modulo arbeitest kannst du jede Zahl aus einer längeren Ziffernfolge rauspicken ;D

d.h.
123456 % 10 = 6
123456 % 100 = 56 / 10 = 5
123456 % 1000 = 456 / 100 = 4
123456 % 10000 = 3456 / 1000 = 3

Ich nehme an daraus kannst du selbst einen Algorithmus ableiten....
( sry Gene ich hab mir deinen Algo noch nicht angeschaut ) aber ich weiss das Gene das selbe meint... ;D

Gruß
 

devDevil

Erfahrenes Mitglied
#5
Hm und woher wisst ihr, wie lang die Zahl nun ist? ;) Die Lösung liegt im Logarithmus! Mit Modulo kann man dann auf die einzellnen Stellen zugreifen. Aber um zu wissen, wie viele Stellen man überhaupt hat - log.
 

RedWing

Erfahrenes Mitglied
#6
Hallo,

Hm und woher wisst ihr, wie lang die Zahl nun ist? ;) Die Lösung liegt im Logarithmus! Mit Modulo kann man dann auf die einzellnen Stellen zugreifen. Aber um zu wissen, wie viele Stellen man überhaupt hat - log.
man braucht die Länge der Zahl nicht unbedingt, wenn man die einzelnen Ziffern nicht gerade in einem Array ablegen will, da man als Abbruchbedingung einfach die Restzahl 0 nehmen kann.

Gruß,
RedWing
 

devDevil

Erfahrenes Mitglied
#9
Ich rede davon, dass du nicht feststellen kannst, ob du am Ende der Zahl angekommen bist, wenn du hingehst und einfach darauf wartest, dass 0 rauskommt!

... 0 ... % 1 ... = 0 / 1 ... = 0
Damit muss aber nicht das Ende gegeben sein! Deswegen erst Länge berechnen, dann einfach per for-Schleife durchgehen.
 

RedWing

Erfahrenes Mitglied
#10
Hallo,

Ich rede davon, dass du nicht feststellen kannst, ob du am Ende der Zahl angekommen bist, wenn du hingehst und einfach darauf wartest, dass 0 rauskommt!

... 0 ... % 1 ... = 0 / 1 ... = 0
Damit muss aber nicht das Ende gegeben sein! Deswegen erst Länge berechnen, dann einfach per for-Schleife durchgehen.
Ich denke wir reden aneinander vorbei. Verzeih mir wenn ich keine Lust habe zu diskutieren :)

Probier mal bitte das Beispiel bei dir aus und überdenk deine Überlegung nochmal:

C:
#include <stdio.h>

int main()
{
  int number = 205, temp, pot = 10, ziffer;

  do {
    temp = number % pot;
    ziffer = temp / (pot / 10);
    printf("%d\n", ziffer);
    pot *= 10;
    number -= temp;
  } while (number != 0);

  return 0;
}
Gruß,
RedWing
 

Neue Beiträge