Zerlegung einer Zahl in ihre Ziffern



  • hallo, ich hab dieses geschrieben

    #include <iostream>
    using std::cout;
    using std::cin;
    using std::endl;
    
    
    
    void split(int x){
    	int reverse = 0, rest;
    	while(x!=0){
    		rest = x%10;
    		reverse=reverse*10+rest;
    		x/=10;
    		}
    	while(reverse){
    		cout<<reverse%10<< endl;
    		reverse/=10;
    		}
    	
    	}
    
    
    
    
    int main()
    {
        cout << "Bitte eine Zahl eingeben: ";
        int n = 0;
        cin >> n;
        split(n);
        
        cout << "----------" << endl;
    }
    

    nun habe ich ein Problem. wenn man irgendeine Zahl, die mit 0 endet, eingibt, wird 0 nicht ausgegeben.(na ja, ich hab keine Ahnung, wie sollte ich das Code schreiben, sodass 0 bleibt). Ich hab auch gedacht, dass ich if-else hier reinschreiben(als Überprüfung, ob die Modulo von einer Zahl 0 ist oder nicht)

    while(x!=0){
    		rest = x%10;
    		reverse=reverse*10+rest;
    		x/=10;
    		}
    

    vielen Dank



  • Ist doch logisch. Wenn Du die Ziffern Deiner Eingangszahl umdrehst, wird aus der letzten 0 eine führende 0 und verliert Ihre Bedeutung. Da mußt Du Dir schon was anderes einfallen lassen (Stack).

    mfg Martin



  • Wie wärs wenn du die Nummer einfach zu nem String reinterpretierst? Mit std::to_string() oder so?


  • Gesperrt

    Mit Stack:

    #include <iostream>
    #include <stack>
    
    using std::cout;
    using std::cin;
    using std::endl;
    using std::stack;
    
    void split2(int x, stack<int> *st)
    {
        if (x)
        {
            st->push(x % 10);
            split2(x / 10, st);
        }
    }
    
    void split (int x)
    {
        stack<int> st;
        split2 (x, &st);
        if (st.empty())
            cout << 0 << endl;
        while (!st.empty())
        {
            cout << st.top() << endl;
            st.pop();
        }
    }
    
    
    int main()
    {
        cout << "Bitte eine Zahl eingeben: ";
        int n = 1;
        cin >> n;
        split(n);
    
        cout << "----------" << endl;
    }
    
    


  • Mja, danke für die Mathe 😃

    Hab ich mich auch mal dran versucht. Da, hab mir Mühe gemacht:

    #include <vector>
    
    template<typename T>
    std::vector<T> split(T value){
        std::vector<T> res;
    
        do{
            res.insert(res.begin(), value % 10);
        } while(value /= 10);
    
        return res;
    }
    
    
    #include <iostream>
    
    int main(){
        std::vector<int> v{123, 5634, 34566, 2342, 5665};
    
        for(int i : v){
            for(int digit : split(i))
                std::cerr << digit << ':';
            std::cerr << '\n';
        }
    }
    


  • @RBS2 sagte in Zerlegung einer Zahl in ihre Ziffern:

    Mit Stack:

    void split2(int x, stack<int> *st)
    

    Pointer ist schon eher Gaga wenn das Argument nicht optional ist.



  • Die Lösung ist blöd und ineffizient , aber sie funktioniert:

    int main()
    {
        int test = 1234560;
        std::stringstream str;
        str << test;
        char c;
        while ( str >> c )
        {
            int ziffer = c - '0';
            std::cout << ziffer << "\n";
        }
        return 0;
    }
    


  • Damit von mir auch noch ein Blödsinn dasteht:

    #include <type_traits>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
    auto split(T value, unsigned base = 10)
    {
    	std::vector<unsigned> digits;
    	
    	do digits.push_back(value % base);
    	while (value /= base);
    	
    	std::reverse(digits.begin(), digits.end());
    	return digits;
    }
    
    char digit2char(unsigned digit)  // ausbaufaehig fuer base > 36 in digit2str()
    {
    	return digit < 10 ? '0' + digit : 'A' + digit - 10;
    }
    
    int main()
    {
    	for (auto const &digit : split(243, 16))
    		std::cout << digit2char(digit) << ' ';
    	std::cout.put('\n');
    }
    


  • Ein Standardalgorithmus dafür wird auch in https://www.youtube.com/watch?v=o4-CwDo2zpg&t=1678s gezeigt.
    @zizinho16: Alexandrescu ist nicht unbedingt für Anfänger. Aber ggf. ist der gesamte Talk (nicht nur der Abschnitt hier) trotzdem spannend.



  • Danke für die Antworten!

    Also die Aufgabe lautet: Verwenden Sie zum Zerlegen der Zahl ausschließlich die Divisions- und Modulooperatoren sowie
    Schleifen. Verwenden Sie keine string-, vector-, list-Datentypen bzw. Arrays oder Ähnliches!
    Die Länge der eingegeben Zahl ist vorher nicht bekannt.

    Deswegen habe ich in meiner Lösung nur einfache Funktionen benutzen.



  • @zizinho16 Hast Du auch eine Frage?



  • ich habe jetzt eine Lösung durch Schleife while gefunden.

    vielen Dank


Anmelden zum Antworten