Länge und Stellen



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der Umweg über Strings scheint mir ziemlich umständlich. Es dürfte mit

    unsigned first_two_digits(unsigned x) {
      while(x > 100) {
        x /= 10;
      }
    
      return x;
    }
    

    allemal schneller gehen. Das geht natürlich auch direkt:

    #include <cmath>
    
    unsigned first_two_digits(unsigned x) {
      double lx10 = std::floor(std::log10(static_cast<double>(x)));
      double px10 = std::pow(10, lx10 - 1);
    
      return x / static_cast<unsigned>(px10);
    }
    

    Ich habe allerdings meine Zweifel, dass das in der Realität tatsächlich einen Performancegewinn bringt. Gebencht habe ich es nicht.



  • Korrektur: Das muss natürlich

    while(x >= 100) {
    

    heißen.



  • Danke für die Tips. Habe letztlich das Programm zum Laufen bekommen. Mit der math Biblio... hab ich noch nicht gearbeitet. Könnte jemand mal die letzten verbesserungen erklären, also warum while statt der For-Shleife, was ist unsigned, was std: etc....



  • Bekell schrieb:

    Mit der math Biblio... hab ich noch nicht gearbeitet. Könnte jemand mal die letzten verbesserungen erklären, also warum while statt der For-Shleife, was ist unsigned, was std: etc....

    mathe-bibliothek: ist halt ein header, der viele nützliche funktionen mit sich bringt. doku findest du z.bsp. unter cplusplus.com

    unsigned: ist eine natürliche zahl.
    int == signed int == signed == ca. -2^31 ... 2^31
    unsigned = unsigned int == ca. 0 ... 2^32

    std:: (2 doppelpunkte) gibt den namespace an, in der die funktion gesucht werden soll:

    namespace my_ns
    {
      void my_func()
      {
      }
    }
    
    int main()
    {
      my_func(); //geht nicht, da nicht im globalen namespace
      my_ns::my_func(); //geht
    
    //geht auch:
      using namespace my_ns;
      my_func();
    }
    

    du wirst vermutlich bisher immer ein using namespace std; über deiner main-funktion haben und dich gewundert haben, welchen sinn diese zeile haben sollte - jetzt weißt du es hoffentlich gut genug, um den rest im buch deines vertrauens nachlesen zu können.

    zum thema lerning by doing: dafür ist c++ nicht gerade geeignet

    für was brauchst du denn die "sagen wir die ersten beiden Ziffern geben lassen, und die letzte"?
    willst du es als string oder lieber als int?
    ich nehme mal an, int reicht. für die ersten beiden ziffern hast du die lösung ja schon. die letzte ist ähnlich einfach:

    int letzte_ziffer(unsigned int value)
    {
      if(val <= 9)
        return val;
    
      return val%10;
    }
    

    bb



  • unskilled schrieb:

    int letzte_ziffer(unsigned int value)
    {
      if(val <= 9)
        return val;
    
      return val%10;
    }
    

    Machst du die if-Anweisung aus Performance-Gründen?



  • nö - was ergibt wohl 0%10? 😛
    und wenn ich schon ne abfrage auf 0 mache, kann ichs auch gleich so machen.



  • unskilled schrieb:

    nö - was ergibt wohl 0%10? 😛

    Äh...Null, was genau das gewünschte Ergebnis ist.



  • Danke, das Programm läuft, ist auch verständlich, wenn ich umständlich programmiere. Mir kommen manchmal mat. Fragen, zu B., wollte ich gerade wissen, wieviele Natürliche Zahlen es gibt, die einen Teiler ihrer selbst als mögliches Querprodukt in sich tragen: z. b. 735 ist so eine Zahl, denn 7 * 35 ist 245 und 245 * 3 = 735 ....

    .. das löse ich dann auf c++ mit x-code .... da ich bisher nur bis 999 gelöst habe, muß ich das für die höheren Bereiche noch optimieren, denn je mehr Stellen eine Zahl, desto mehr mögliche Querprodukte gibt es, u. a. das gmqp (größtmögliche Querprodukt) und das kmqp. Da ist noch viel zu forschen. Mir war letzte Woche aufgefallen, daß 18144 ein Vielfaches von 2592 ist, und 18*144 sind 2592 ... lustig, oder?

    Sowas interessiert nur Verrückte .... 😋

    Das schöne am Programmieren ist, daß durch leicht zu lösende Aufgaben im unteren Bereich das Programm kontrollieren kann, und wenn es läuft in die oberen Bereiche vorstoßen kann, wo es mit dem Kopf etwas langwieriger werden würde und die Gewissheit, daß der Computer richtig rechnet, solange wir seine Grenzen kennen.



  • seldon schrieb:

    unskilled schrieb:

    nö - was ergibt wohl 0%10? 😛

    Äh...Null, was genau das gewünschte Ergebnis ist.

    hab iwie auch gerad wieder dran gedacht und kam mir ein wenig doof vor 😃
    kA, was da mit mir los war 😃


Anmelden zum Antworten