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?
-
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