aus Einer Zahl die Ziffern rauspicken



  • hi,

    Wie kann ich aus Einer Zahl die Ziffern (Einer, Zehner...) rauspicken?

    int zahl = 195;
    .
    .
    .
    cout << zahl[0] // müsste doch 1  sein geht ja nicht !!! 
    cout << zahl[1] // müsste doch 9  sein geht ja nicht !!! 
    cout << zahl[2] // müsste doch 5  sein geht ja nicht !!!
    

    VIelen Dank ⚠



  • Mach aus der Zahö nen String:

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=IntToString#Answ

    und dann kannste mit [0] [1] [2] an die Ziffern rann



  • Nehmen wir mal 123 als zahl an:

    Einer: 123 % 10 == 3
    Zehner: (123 / 10) % 10 == 2
    Hunderter: (123 / 10 / 10) % 10 == 1
    Tausender: (123 / 10 / 10 / 10) % 10 == 0

    alles klar? 😉



  • Hallo,
    und was ist jetzt schöner?

    vector<int> number2Digits(int n)
    {
    	n = abs(n);
    	int p = log(n)/log(10);
    	vector<int> result;
    	result.reserve(p);
    	int div = pow(10, p);
    	while (div > 0)
    	{
    		result.push_back(n / div);
    		n %= div;
    		div /= 10;
    	}
    	return result;
    }
    

    oder:

    vector<int> number2Digits2(int n)
    {
    	n = abs(n);
    	vector<int> result;
    	while (n > 0)
    	{
    		result.push_back(n % 10);
    		n /= 10;
    	}
    	reverse(result.begin(), result.end());
    	return result;
    }
    

    oder vielleicht doch rekursiv (ohne reverse):

    void number2Digits3(int n, vector<int>& v)
    {
    	n = abs(n);
    	if (n == 0) return;
    	int temp = n % 10;
    	number2Digits3(n / 10, v);
    	v.push_back(temp);
    }
    

    Oder wie macht das jemand, der sich mit Algorithmen und Funktionen auskennt?



  • die frage ist, was für einen anfänger leichter zu verstehen ist.. das problem haben hier leider viele, dass sie immer mit lösungen kommen, die kein anfänger verstehen kann.. damit helft ihr hier keinem..



  • Hi,

    häh, die Modulo- und die Stringlösung sind doch wirklich die einfachsten, einfacher geht es ja nicht.

    Wobei die Stringlösung wahrscheinlich zumindest bei kürzeren Zahlen langsamer als der String ist, weil kein Speicher allokiert werden muss und sowieso eigentlich jede Zahl -> String-Funktion intern die Modulolösung verwendet. 🙂

    ChrisM



  • der blobb schrieb:

    die frage ist, was für einen anfänger leichter zu verstehen ist.. das problem haben hier leider viele, dass sie immer mit lösungen kommen, die kein anfänger verstehen kann.. damit helft ihr hier keinem..

    Was man an o. Code kenne muss ist der Modulo-Operator, ansonsten muss man sich
    ein wenig mit Mathe auskennen (und die Division durch 10 sollte keine allzu
    grosse Herausforderung sein).

    Bei Humes erste Loesung muss man etwas genauer hinschauen, da sie, entschuldige
    :D, etwas unordentlich aussieht 😉 (nein ich kanns nicht ordentlicher :D).

    Bei der zweiten Loesung sollte dann aber alles klar sein. Auch ohne das man
    vector<> oder abs() kennt, denke ich ist es sehr leicht zu erkennen was gemacht
    wird, wenn man sich die Rechnung anschaut.

    Wenn man jetzt hingeht und die Rechnung mit nem kleinen Zettel und en Stift
    anhand einer Zahl nachrechnet, sollte das prinzip absolut klar sein.

    Jetzt kann man sich die Funktionalitaet von vector<>, abs() und reverse() aus
    der Doku herauslesen (man kann es aber auch vorher machen).

    mfg
    v R



  • @ChriM Die Stringlösung ist eigentlich fehl am platze. Hab mal wieder nur halb gelesen und aus gewohnheit der Fragen : "Wie mache ich aus einer Zahl einen String" angenommen das die einzelnen Ziffern als String vorhanden sein müssen....

    (Wenigstens verfehlt man mit der riesen Kanone den Spatz nicht 🤡)



  • HumeSikkins schrieb:

    Hallo,
    und was ist jetzt schöner?

    vector<int> number2Digits(int n)
    {
    	n = abs(n);
    	int p = log(n)/log(10);
    	vector<int> result;
    	result.reserve(p);
    	int div = pow(10, p);
    	while (div > 0)
    	{
    		result.push_back(n / div);
    		n %= div;
    		div /= 10;
    	}
    	return result;
    }
    

    ich würde die abs und log aufrufe sparen und stattdessen reserve mit sowas wie 32 aufrufen, erst wenn ich wüßte das ich mit sehr wenig speicherplatzu auskommen müste würde ich zu sowas greifen (aber dann würde ich wahrscheinlich ehr eine funktion machen int digit(int zahl, int ziffern_nr)
    und wenn der user dann glaubt er braucht ein vector weil er die ziffern oft braucht und nicht bei jeden call neu berechnen lassen will dann kann er immer noch das ergebnis in einen vector schreiben



  • ich meinte die lösung von hume.. die modulo lösung ist wirklich gut und einfach verständlich.. aber dann kann sich doch mit dem arsch denken, dass ein anfänger die lösungen von hume nicht peilt..



  • ich meinte die lösung von hume.. die modulo lösung ist wirklich gut und einfach verständlich.. aber dann kann sich doch mit dem ***** denken, dass ein anfänger die lösungen von hume nicht peilt..

    Was bitte ist an meinen drei Lösungen denn so kompliziert? Und inwiefern unterscheiden sie sich denn von der wirklich guten Modulo-Lösung? Ist meine zweite Lösung nicht genau die Modulo-Lösung?

    die frage ist, was für einen anfänger leichter zu verstehen ist..

    Nein. Die Frage ist:

    Wie kann ich aus Einer Zahl die Ziffern (Einer, Zehner...) rauspicken?

    das problem haben hier leider viele, dass sie immer mit lösungen kommen, die kein anfänger verstehen kann.. damit helft ihr hier keinem

    Dazu zwei Dinge:
    1. Zur Wiederholung:
    Was ist an den Lösungen von mir so furchtbar kompliziert, dass sie arme Anfänger nicht nur nicht verstehen können, sondern scheinbar ihnen auch jede Möglichkeit nimmt, Verständnisprobleme mittels Rückfragen zu klären?

    2. Hast du meinen Beitrag überhaupt gelesen? Wo steht dann da, dass die Lösungen gut sind? Habe ich nicht vielmehr meine bescheidenen Lösungsversuche in die Menge geworfen, in der Hoffnung, dass sie vielleicht dem einen oder andern hilft, aber insbesondere auch mit der Bitte das jemand "der sich mit Algorithmen und Funktionen auskennt" konkrete Verbesserungsvorschläge macht?
    Damit habe ich indirekt doch selbst um Hilfe gebeten.

    Also kurz: Wo ist eigentlich dein Problem?



  • @Hume:

    Ich finde Deine Lösungen ganz gut, bis auf eine Kleinigkeit:
    Alle drei haben Probleme mit der 0. Die erste dürfte abstürzen (log(0)).
    Die anderen geben keine einzige Ziffer zurück.



  • Jester schrieb:

    Ich finde Deine Lösungen ganz gut, bis auf eine Kleinigkeit:
    Alle drei haben Probleme mit der 0. Die erste dürfte abstürzen (log(0)).
    Die anderen geben keine einzige Ziffer zurück.

    Um dieses Problem habe ich mich ehrlich gesagt absichtlich gedrückt. Auf die schnelle konnte ich mich nämlich nicht für ein Verhalten bei 0 entscheiden.
    Jetzt wo ich drüber nachdenke, frage ich mich allerdings, warum ich zwischenzeitlich für 0 etwas anderes als eine Ziffer, nämlich 0, liefern wollte.

    Btw:
    log(0)/log(10) liefert beim VC -1.INF. Das zugewiesen an einen int liefert 0. Deshalb ist mir der Fehler nicht direkt aufgefallen.



  • HumeSikkins schrieb:

    log(0)/log(10) liefert beim VC -1.INF. Das zugewiesen an einen int liefert 0. Deshalb ist mir der Fehler nicht direkt aufgefallen.

    Oh, dann entschuldige bitte. Diese Lösung ist demnach korrekt. div wird damit nämlich zu 1 und damit läuft die while-Schleife einmal und es kommt genau die Ziffer 0 raus. Die Lösung gefällt mir dann wohl am besten, weil sie ohne Behandlung des Spezialfalls auskommt.

    MfG Jester



  • @Jester
    Ne, ne. Du hast schon recht. Das die Zuweisung von INF an int 0 liefert, ist imo keinesfalls garantiert. Der gcc 3.3.2 liefert z.B. INT_MIN nicht 0.



  • @hume
    ich gebs auf.. du scheinst dich irgendwie immer gleich "leicht" angegriffen zu fühlen, wenn mal einer was gegen deine lösungbeispiele sagt.. es mag für dich zwar unvorstellbar sein aber es soll auch leute geben, die mit c++ anfangen und denen eine einfache lösung vielleicht lieber ist..
    (ja, es gibt tätsächlich

    arme Anfänger

    die nicht, wie du, von anfang an perfekt waren)

    Was ist an den Lösungen von mir so furchtbar kompliziert, dass sie arme Anfänger nicht nur nicht verstehen können, sondern scheinbar ihnen auch jede Möglichkeit nimmt, Verständnisprobleme mittels Rückfragen zu klären?

    klar könnte man das mittels rücksprache klären.. aber wenn hier jemand nach einer lösung fragt, sollte man ihm eine lösung geben und nicht neue probleme schaffen..

    Zitat:
    die frage ist, was für einen anfänger leichter zu verstehen ist..

    Nein. Die Frage ist:
    Zitat:
    Wie kann ich aus Einer Zahl die Ziffern (Einer, Zehner...) rauspicken?

    nein, die frage ist:
    Wie kann ich aus Einer Zahl die Ziffern (Einer, Zehner...) rauspicken, mit einer lösung bei der ich nicht wieder neue probleme bekomme..

    Also kurz: Wo ist eigentlich dein Problem?

    im moment hab ich keins.. wenn ich eins habe, bist du der erste der es erfährt 🙂



  • Blobb du darfst nicht von dir auf andere schließen, es gibt viele Menschen die
    gerne wissen wollen wie etwas geht und nicht nur wie man es löst. Da sind humes
    Beispiele doch ideal. Und nur weil sie für dich schwer verständlich sind, weshalb
    sollte der Threadersteller sie nicht verstehen, wenn er etwas mathematisches
    Verständnis besitzt. Die Operatiren wie Modulo-Division (%) kann er ja in seinem
    Buch nachschlagen falls er sie nicht kennen sollte.
    Diese Beispiele sind abgesehen vllt. vom logarithmus einfache Mathematik und so
    etwas jdm nicht zuzutrauen ist ja schon fast eine Beleidigung.



  • der blobb schrieb:

    es mag für dich zwar unvorstellbar sein aber es soll auch leute geben, die mit c++ anfangen und denen eine einfache lösung vielleicht lieber ist..

    das stimmt. Aber wir sind hier nicht in einem: "Anfänger sucht simple Lösung Forum", sondern hier geht es um C++.

    Warum sollte man also nicht auch gute Möglichkeiten angeben - vielleicht hilft das dem OP nicht, aber vielleicht hilft es anderen Leuten. Schliesslich lesen ja viele Leute mit.

    klar könnte man das mittels rücksprache klären.. aber wenn hier jemand nach einer lösung fragt, sollte man ihm eine lösung geben und nicht neue probleme schaffen..

    Nur leider lernt der Anfänger so nix.
    Woher soll er wissen, dass man es besser machen kann, wenn er immer nur die simpelste Lösung als Antwort bekommt.

    Er muss ja nicht die komplizierteste nehmen - er kann nachfragen wenn er sie verstehen will. Aber wenn nicht, nimmt er eine der anderen Lösungen die ihm angeboten worden sind.



  • @der blobb
    Warum beantwortest du nicht einfach mal meine Frage, statt mir jetzt irgendwelche Unverschämtheiten in den Mund zu legen?

    *Was* ist an meiner Lösung kompliziert?

    Und wenn du Komplexität so gut erkennen kannst:
    *Warum* zeigst du nicht eine einfachere Lösung?

    Die erste Frage habe ich schon mehrfach gestellt. Die zweite stand letztlich bereits in meinem ersten Beitrag, in dem ich ja bereits darauf hingewiesen habe, dass ich auf der Suche nach besseren Lösungen bin.

    Kritik ist immer ok. Nur wenn du Kritik übst, dann wäre es nett, wenn du *konkret* werden würdest.

    klar könnte man das mittels rücksprache klären.. aber wenn hier jemand nach einer lösung fragt, sollte man ihm eine lösung geben und nicht neue probleme schaffen..

    Da ich eben gerade nicht perfekt bin, habe ich auch nicht immer die richtige Lösung(tm) auf Lager. Ich kann nur *versuchen* mit meinen Ideen zu helfen.
    Das klappt mal mehr und mal weniger gut. Das ich hier aber "neue Probleme" geschaffen habe, war und ist mir nicht bewusst.

    Wie kann ich aus Einer Zahl die Ziffern (Einer, Zehner...) rauspicken, mit einer lösung bei der ich nicht wieder neue probleme bekomme..

    Wie will man diese Frage beantworten ohne den Kontext des Problems sowie den genauen Kentnissstand (?) des OPs zu kennen?

    Ich persönlich finde es etwas schade, dass du mich kritisierst, mir aber nicht erklären willst warum genau und mir damit die Möglichkeit nimmst dazu Stellung zu nehmen.



  • Wenn man die Lösungen vom Kenntnisstand (;)) des OPs abhängig macht, muss man
    a) wissen, was der OP kann
    b) wissen, das der OP immer denselben Kenntnisstand behalten will.

    Man kann hier nachfragen, wenn man etwas nicht versteht, das ist ja das Gute an einem Forum 😉
    Außerdem bringt es für den OP Vorteile, wenn er auch *anständige* Lösungen, die eben manchmal *komplex* sind, kennen lernt.
    Er will sich idR ja weiterentwickeln, oder?


Anmelden zum Antworten