Announcement

Collapse
No announcement yet.

Anzahl Zahlen einer Zahl

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anzahl Zahlen einer Zahl

    Grias Gott,

    kann mir jemand mit a bisserl mathe aushelfen ?

    ich würde gerne eine verkettung von ZAHLEN machen

    und zwar NICHT mit dem klassischen >&< (braucht elendig lange)

    Beispiel:

    Code:
    Dim zahl1 as Integer = 123
    Dim zahl2 as Integer = 3
    Dim zahl3 as Integer = 442
    
    Dim Ergebnis as Integer = zahl1 || zahl2 || zahl3
    ' Ergebnis = 1233442
    *wiedermal peinlich*


    ich hatte die MOD verkehrt gesetzt ...
    bei Zahl Mod 10 kommt ja die stellenzahl raus

    ich machs mal doch selber und setze s ergebnis dann anschaubar rein


    vielen dank für nen guten tipp
    Zuletzt editiert von Fremder; 22.09.2010, 16:52.
    Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
    Um heute vorm PC zu sitzen!

  • #2
    zahl1 *10000
    +zahl2*1000
    +zahl3

    Ansonsten Zahl in Strings verwandeln und zusammenführen
    Christian

    Comment


    • #3
      und zwar NICHT mit dem klassischen >&< (braucht elendig lange)
      Verketten ist was anderes als &. Und & sollte schneller sein als so ziemlich jede andere vorstellbare Operation.

      Eine lange Zahl lässt sich nur als string also ist es am sinnvollsten so wie Christian vorgeschlagen hat die Zahlen gleich in einen string zu wandeln und dann zu verketten.
      Zuletzt editiert von gfoidl; 27.09.2010, 13:47. Reason: [ beim fehlenden End-Quote-Tag hinzugefügt

      Comment


      • #4
        danke schonmal.

        bei mir kommt halt n krasser zeitunterschied raus, wenn ich

        mit string arbeite.

        Statt 154 ms sinds dann etwa 1500 ms

        will ja nicht kleinlich sein, aber der "Faktor" ist schon hart *g*


        Originally posted by Christian Marquardt View Post
        zahl1 *10000
        +zahl2*1000
        +zahl3

        Ansonsten Zahl in Strings verwandeln und zusammenführen
        ich will ja gerade die zahl1 * Länge ^ 10
        ausprobieren.

        ich brauche allerdings irgend einen MOD oder potenzierung, mit welcher
        schnell festgestellt werden kann wieviel stellen eine Zahl hat.

        sorry ... dies ist wohl mathegrundwissen, welches bei mir a bisserl happert.
        Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
        Um heute vorm PC zu sitzen!

        Comment


        • #5
          zahl1 * Länge ^ 10
          so bezieht sich '^10' nur auf Länge ist das gewollt?

          Und wofür soll das gut sein? Vielleicht verstehe ich die Frage wenn ich dein eigentliches Ziel kenne.


          Edit: Übrigens. Wenn du mit MOD die Modulo Operation in deiner gewählten .Net Sprache meinst dann ist das der Teilerrest einer Division und hat nix mit der Länge zu tun.

          Comment


          • #6
            [highlight=c#]
            int zahl1 = 123;
            int zahl2 = 4;
            int zahl3 = 567

            var sb = new StringBuilder();
            sb.Append(zahl1);
            sb.Append(zahl2);
            sb.Append(zahl3);

            Console.WriteLine(sb.ToString());
            [/highlight]

            Comment


            • #7
              Da wird sich wohl der Hund in den Schwanz beissen. Die Längewirst du wohl ohne eine Stringoperation oder eine längere mathematische Prüfung (Division) nicht bekommen.
              Bezweifele, dass das schneller als eine Stringoperation ist
              Christian

              Comment


              • #8
                Gerade mal ausprobiert:

                [highlight=c#]
                class Program
                {
                static void Main(string[] args)
                {
                var watch = new Stopwatch();

                watch.Reset();
                watch.Start();

                int zahl1 = 123;
                int zahl2 = 4;
                int zahl3 = 567;

                var sb = new StringBuilder();
                sb.Append(zahl1);
                sb.Append(zahl2);
                sb.Append(zahl3);

                watch.Stop();

                Console.WriteLine(sb.ToString());
                Console.WriteLine("Elapsed Time: " + watch.ElapsedMilliseconds);

                Console.ReadLine();
                }
                }
                [/highlight]

                Ausgabe:

                Code:
                1234567
                Elapsed Time: 0
                Folglich braucht das nicht mal eine millisekunde zum Berechnen

                Comment


                • #9
                  tut mir leid, wie kann ich hier ne excel-tabelle einfügen ?

                  Code:
                  Länge	Zahl n	 =10 ^n	Ergebnis:
                  3	123		123
                  1	3	10	1233
                  2	44	100	123344
                  sorry, ich muss heimdüsen

                  komme am abend wieder rein.


                  PS: Es sind 830.000 * 8 durchläufe
                  (8 sind die jeweiligen zahlengruppen)
                  Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
                  Um heute vorm PC zu sitzen!

                  Comment


                  • #10
                    sofern noch gewünscht, hier meine ergebnisse - welche sich ja mit euren feststellungen (fast) decken :-)

                    Die "Verkettung" bei 830.000 x 8 durchläufen braucht:

                    "String":
                    Ergebnis & = XXX.toString ~ 1.250 ms

                    "Integer":
                    Ergebnis = Ergebnis * (10 ^ myArr(yy, 1)) + myArr(yy, 0) ' = ~1006 ms
                    also ... nicht "wirklich" der rede wert ...

                    "StringBuilder" = 1070 ms !! (wenn die zahlen als Zahlen vorliegen)
                    "StringBuilder" = 376 ms !! (wenn die "zahlen" als String vorliegen)
                    und wenn "Dim sb as New Stringbuilder" vor die schleife gelegt wird
                    und dann mit sb.clear jeweils auf "" gesetzt wird sind nur noch ~ 255 ms :-)

                    = zu meiner entschuldigung möchte ich anmerken:

                    der auslöser war eigentlich ne Linq- JOIN wo eine gesammelte gruppenID
                    mit : Groupierung = Id1 & Id2 und so weiter erstellt wurde. und da warens
                    dann bereits schon fast 5 sekunden :-)


                    vielen dank noch- und hiermit -letztmals zu diesem thema :-))
                    Zuletzt editiert von Fremder; 22.09.2010, 21:58. Reason: Stringbuilder noch getestet
                    Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
                    Um heute vorm PC zu sitzen!

                    Comment


                    • #11
                      Ich bin mal neugierig. Wofür ist das Ergebnis dieser Rechnung denn nun gut?

                      Comment


                      • #12
                        wenn fanderl sagt dass seine operation gestoppt mit einer Stopwatch die Zeit 0, also gar keine Zeit, benötigt um die Operation durchzuführen, heißt das folgendes: Du kannst dass mit beliebig vielen Zahlen zum verketten in keiner Zeit lösen. Ist jetzt eine rein mathematische Betrachtung und wird in der Realität wie immer anders sein.

                        Zum Problem um die "länge" einer Zahl wie du es nennst sprich die höchste 10er Potenz kannst du den Logarithmus benutzen, meine ich. Zum Beispiel log(10) = 1, log(99) = 1,9.. , log(100) = 2. Du musst dann nur noch die Nachkommastellen ausblenden. Als Funktion
                        [highlight=c#]
                        int ExpMax(int zahl)
                        {
                        return (int)Floor(Log((double)zahl);
                        }
                        [/highlight]
                        Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                        Comment


                        • #13
                          @das-d: Floor? Log? Fehlt da nicht Math. vor und hinter Log eine 10 oder ist das nicht c#?

                          Comment


                          • #14
                            dann erlaube ich mir noch kurz stellung zu nehmen *schuldig bin*

                            Code:
                            int ExpMax(int zahl)
                            {
                                  return (int)Floor(Log((double)zahl);
                            }
                            also die länge so rauszubekommen ist dies wohl der richtige ansatz (danke)

                            aufgrund der menge an durchläufen und der tatsache, dass die LÄNGE der jeweiligen Zahlen(INDEXE) vorher festgelegt ist brauch ich diese in der schleife zum Glück nimmer ausrechnen.

                            und der sinn und zweck ist halt einfach der, dass
                            1,5 sekunden zwar nicht viel sind
                            wenn aber diese Daten für ne bestimmte optimierung der ergebnisse
                            später mal mit weiteren 100.000 möglichkeiten optimiert wird, dann is ne
                            kleine sekunde n ganzer batzen

                            aber aktuell ist wohl der Stringbuilder wirklich die beste lösung.

                            (hab nicht gemerkt, dass es auf seite 2 weiterging *g*)

                            ich dachte halt auch, dass wenn ich schon "vergleichsIndexe" erstelle sollten diese in
                            integer vorliegen, weil dies i.d.R. doch der schnellste weg wäre.

                            PS: ich würde gerne nen THREAD aufmachen
                            > Thema:

                            INDIZIEREN von "Speicherdaten" -> ähnlich wie INDEXE in SQL
                            wo soll ich hierzu vorher mal schmökern
                            Zuletzt editiert von Fremder; 22.09.2010, 22:36.
                            Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
                            Um heute vorm PC zu sitzen!

                            Comment


                            • #15
                              Code:
                              INDIZIEREN von "Speicherdaten" ->
                              Ein Stichwort wäre Hash (in .NET z.b. über HashSet)

                              Ich probiere einen 3.ten (und definitiv letzten) Anlauf. Wofür braucht man das was du da tust? Ich habe Probleme dabei Menschen zu helfen von denen ich annehmen muss das was sie da tun Unsinn ist. Du erfragst Hilfe für das letzte Prozent von einem Weg zu einer Lösung für ein Problem von dem ich die ganze Zeit annehmen muss das du schon ganz am Anfang falsch abgebogen bist.

                              Comment

                              Working...
                              X