001
08.07.2003, 01:01 Uhr
Pablo
Supertux (Operator)
|
Was string ziffern (unsigned int); macht ist einfach.
Die Funktion liefert ein String zurück und als Parameter soll eine ganzahlige Zahl (int) ohne Vorzeichen weitergegeben werden. D.h. das Vorzeichen spielt hier keine Rolle.
Diese Funktion wandelt alle Zahlen in string, aber ich kann diesen Code nicht kompilieren. Ich schlage folgendes vor: benutze nicht strings oder chars für sowas, es ist nur kompliziert, mit ints geht es viel einfacher.
Die Funktion unsigned int ziffernQuer (string) addiert die String und gibt als int ohne Vorzeichen zurück. Sei s ein string (string s = "irgendwas"; ) Um die Länge zu bestimmen s.size() aufrufen. Um auf den ersten Buchstabe zugreifen zu können s[0] und auf den letzten s[s.size() -1] aufrufen.
Hier meine Lösung:
C++: |
#include <iostream>
using namespace std;
unsigned int quersumme(unsigned int zahl) { unsigned int summe = 0; while(zahl>0) { summe += (unsigned int) (zahl - (int) (zahl/10) * 10); zahl /= 10; } return summe; } int main() { cout << "Die Quersumme von 12345 = " << quersumme(12345) << endl; }
|
Die interessanteste Stelle ist:
Code: |
while(zahl>0) { summe += (unsigned int) (zahl - (int) (zahl/10) * 10); zahl /= 10; }
|
Weil alle nur ints sind, folgt, dass wenn du durch 10 teilst, verschwinden die Nachkommastellen. Also, 123 / 10 = 12. (1) Ich will die 3, also gilt 123 - 12 * 10 = 3, oder? Ich mache casting (int) obwohl es nicht notwendig ist, aber ich tue es damit es eindeutiger für dich ist. Danach tue ich zahl /= zahl, was das selbe ist wie: zahl = zahl / 10. Also 123 / 10 = 12 Und da Zahl 12 ist, können wir weiter machen, bis wir irgendwann am Schluss gelangen. Dann haben wir eine Division von einer Zahl die kleiner als 10 ist, also ist x / 10 = 0, für alle x = {0, ..., 9}
Nachtrag (1) Das passiert so, wegen der "eager evaluation" von C++. Es gibt wesentlich 2 verschiedene Formen zu "parse" (mir ist kein deutscher Begriff bekannt) (Sytanxerkennung, Pattern Matching, usw.). C/C++ und die meisten OOP (Obejct Orientiert Programming) Sparchen erkennen die Syntax genauso wie wir es in der Realität tun würden. Wir lösen die Klammern, die am tiefsten stehen. Dann ist (a / b) * b nicht unbedingt a, wenn a und b Fließkommazahlen (nie von Pentium Bug gehört?) Es gibt eine andere Strategie, leazy evaluation, die wird von Funktionalen Sprachen benutzt (bsp. Haskell, Dr. Scheme) und sie machen genau das Gegenteil. Die Klammern die am tiefsten stehen, werden am Schluss erkannt. Unter Umständen kann dies besser sein, aber auch nicht. Zum Beispiel: mit C++ kannst du keine unendlichen Listenerzeugen und daraus die erste 10 Elemente ausgeben. In Scheme oder Hasell schon! Wenn du diesen Teil nicht verstehst ode wenn es nicht interessant für dich ist, mach ja nix, denn das lernt man später, wenn man sich mit Funktionellen Sprachen. Ich wollte nur erklären, wieso (a / b) * b != a für Fließkommazahlen ist.
Ich hoff, das hilft dir.
@beefy: PS: Weißt du was casting ist? -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 08.07.2003 um 01:21 Uhr von Pablo Yanez Trujillo editiert. |