Eine Null suchen



  • Moin,
    wie kann man mit z.B. einer for Schleife eine 0 in einer Variablen suchen?

    BD



  • std::size_t findZero(std::size_t x, std::size_t base = 10)
    {
    	std::size_t counter = 0;
    
    	while ( x != 0 )
    	{
    		counter++;
    		if ( x%base == 0 )
    			return counter;
    		counter /= base;
    	}
    
    	return std::numeric_limits<std::size_t>::max();
    }
    

    Geht aber sicherlich besser...



  • Kann man so was auch ohne std:: machen?



  • LightBoom schrieb:

    wie kann man mit z.B. einer for Schleife eine 0 in einer Variablen suchen?

    In _was_ für einer Variablen? In einer Ganzzahl (wie int, long...), in einem String oder in was genau?

    LightBoom schrieb:

    Kann man so was auch ohne std:: machen?

    Der std-Namensraum gehört zur Standardbibliothek von C++, du wirst daher auch kaum längerfristig um diesen Namensraum herum kommen. Aber in den hier beschriebenen Fall kannst du sicherlich auch gut ohne auskommen (std::size_t würde ich durch einen unsigned int ersetzen, welchen Typ x hat, hängt von der Antwort auf die obige Frage ab, und statt numeric_limits solltest du dir einfach überlegen was in dem Falle zurückgeliefert werden soll, wenn keine 0 gefunden wird.


  • Mod

    Geht aber sicherlich besser...

    Ja, wieso nimmst du std::size_t ? Wohl sehr unpassend.

    Auf einigen CPUs könnte das hier schneller sein:

    template< typename Integral >
    std::size_t findZero(Integral x, Integral base = 10)
    {
    	auto d = std::div(x, base);
    	for (std::size_t counter = 0; d.quot != 0 ; ++counter)
    	{
    		if( d.rem == 0 )
    			return counter;
    
    		d = std::div(d.quot, base);
    	}
    
    	return -1;
    }
    

    Beim GCC (4.9, i7) bekomme ich folgende Verhältnisse:

    • Ohne Optimierung:
    Arcoth:   0.81097
    Skymosh0: 0.913373
    

    Immer in dem Verhältnis schneller.

    • Alle Optimierungen ab -O: Deine Variante ist doppelt so schnell!

    Bei Clang (3.5) bekomme ich folgende Verhältnisse:

    • Ohne Optimierung: Deine Variante ist etwas schneller (85/90)
    • Ab -O: Deine Variante ist ganz leicht schneller (aber konstant)

    Getestet mit folgendem Code. Auf Coliru ist Clang ohne Optimierung bei meiner Variante übrigens wieder schneller, und zwar so zwei statt drei Sekunden.



  • Arcoth, hast du den Assemblercode angeschaut?

    Ich kann mir vorstellen, dass Compiler zwei nahe zusammenliegende Divisionen und Modulos optimieren können und man durch std::div() nichts gewinnt. Ausserdem ist deine Schleife etwas komplizierter als die von Skym0sh0, aber ob der Code deswegen langsamer ist...?


  • Mod

    Mit dem Template übertreibst du aber echt...

    Warum? Das ist eigentlich nur eine Antwort darauf dass der TE praktisch keine Eigeninitiative zeigt.

    Ich kann mir vorstellen, dass Compiler zwei nahe zusammenliegende Divisionen und Modulos optimieren können und man durch std::div() nichts gewinnt.

    Der Punkt ist, dass genau das erst ab einem bestimmten Optimierungslevel in Kraft tritt, div das aber forciert (falls überhaupt möglich).

    Die Sache ist nur, dass man dadurch auch nichts verlieren sollte. Aber GCC inlined div nicht.

    .L3:
    	call	rand
    	mov	esi, 10
    	mov	edi, eax
    	call	div
    	mov	rdx, rax
    	mov	edi, eax
    	sar	rdx, 32
    	test	eax, eax
    	je	.L5
    	test	edx, edx
    	jne	.L7
    	jmp	.L5
    .L8:
    	test	ecx, ecx
    	je	.L5
    .L7:
    	mov	esi, 10
    	call	div
    	mov	rcx, rax
    	mov	edi, eax
    	sar	rcx, 32
    	test	eax, eax
    	jne	.L8
    


  • LightBoom schrieb:

    Kann man so was auch ohne std:: machen?

    dARfst du das nicht bei den hausaufgaben verwenden?



  • @imfree
    Hahaha, ich gehe gar nicht mehr zur Schule



  • Sag welche Art Variable du meinst anstatt auf Nonsense zu antworten.



  • Eine Array (int value[200]) ... Habe wieder Variable geschrieben statt Array geschrieben 😡



  • auto result = std::find(std::begin(array), std::end(array), 0);
    std::cout << "Erste Null an Index " << result - std::begin(array) << std::endl;
    

    Nein, das geht nicht ohne std. :p



  • #include <algorithm>
    #include <iostream>
    int main(){
        int vals[200];
        auto position = std::find(begin(vals), end(vals), 0) - std::begin(vals);
        std::cout << position == 200 ? "Keine Null gefunden" : "Null an position " + std::to_string(position) + " gefunden";
    
        for (auto it = std::begin(vals); it != std::end(vals); ++it)
            if (*it == 0)
                std::cout << "Null an Position " << it - std::begin(vals) << " gefunden\n";
    }
    

    Ungetestet. Ich will es auch nicht ohne std:: hinkriegen.


  • Mod

    std::cout << position == 200 ? "Keine Null gefunden" : "Null an position " + std::to_string(position) + " gefunden";
    

    Du bist ein drei Sterne Programmierer. 👎

    if( position == 200 )
        std::cout << "Keine Null gefunden";
    else
        std::cout << "Null an Position" << position << " gefunden";
    


  • Da sind gar keine Sterne drin. Aber ja, das kann man alles noch hübscher hinkriegen. Es gibt Leute die kriegen schon bei der for-Schleife ohne Klammern die Krise.


  • Mod

    Das geht doch noch verstaendlicher:

    std::cout << "Es wurde " << (position != 200)["keine Null gefunden.\n"];
    

    🤡



  • ich denk mal du hast eher etwas in dieser richtung gesucht

    for (int i=0; i<=199;i++)
    {
    	if (array[i]==0 )
    	{
    		cout << "0 an position " << i << endl;
    		break;
    	}
    }
    


  • SeppJ schrieb:

    Das geht doch noch verstaendlicher:

    std::cout << "Es wurde " << (position != 200)["keine Null gefunden.\n"];
    

    🤡

    😃
    Ja, ich musste nachdenken.

    Wenn du das jetzt noch lokalisierbar machen kannst gibt's ein Keks.
    Bzw. den eigentlich gewünschten String "Null an position XXX gefunden" ausgeben. 🤡


  • Mod

    Wenn du das jetzt noch lokalisierbar machen kannst gibt's ein Keks. Bzw. den eigentlich gewünschten String "Null an position XXX gefunden" ausgeben.

    Du hast danach gefragt:

    std::cout << position * 30 + "\b\bNull an Position 0 gefunden\0\b\bNull an Position 1 gefunden\0\b\bNull an Position 2 gefunden\0\b\bNull an Position 3 gefunden\0\b\bNull an Position 4 gefunden\0\b\bNull an Position 5 gefunden\0\b\bNull an Position 6 gefunden\0\b\bNull an Position 7 gefunden\0\b\bNull an Position 8 gefunden\0\b\bNull an Position 9 gefunden\0\bNull an Position 10 gefunden\0\bNull an Position 11 gefunden\0\bNull an Position 12 gefunden\0\bNull an Position 13 gefunden\0\bNull an Position 14 gefunden\0\bNull an Position 15 gefunden\0\bNull an Position 16 gefunden\0\bNull an Position 17 gefunden\0\bNull an Position 18 gefunden\0\bNull an Position 19 gefunden\0\bNull an Position 20 gefunden\0\bNull an Position 21 gefunden\0\bNull an Position 22 gefunden\0\bNull an Position 23 gefunden\0\bNull an Position 24 gefunden\0\bNull an Position 25 gefunden\0\bNull an Position 26 gefunden\0\bNull an Position 27 gefunden\0\bNull an Position 28 gefunden\0\bNull an Position 29 gefunden\0\bNull an Position 30 gefunden\0\bNull an Position 31 gefunden\0\bNull an Position 32 gefunden\0\bNull an Position 33 gefunden\0\bNull an Position 34 gefunden\0\bNull an Position 35 gefunden\0\bNull an Position 36 gefunden\0\bNull an Position 37 gefunden\0\bNull an Position 38 gefunden\0\bNull an Position 39 gefunden\0\bNull an Position 40 gefunden\0\bNull an Position 41 gefunden\0\bNull an Position 42 gefunden\0\bNull an Position 43 gefunden\0\bNull an Position 44 gefunden\0\bNull an Position 45 gefunden\0\bNull an Position 46 gefunden\0\bNull an Position 47 gefunden\0\bNull an Position 48 gefunden\0\bNull an Position 49 gefunden\0\bNull an Position 50 gefunden\0\bNull an Position 51 gefunden\0\bNull an Position 52 gefunden\0\bNull an Position 53 gefunden\0\bNull an Position 54 gefunden\0\bNull an Position 55 gefunden\0\bNull an Position 56 gefunden\0\bNull an Position 57 gefunden\0\bNull an Position 58 gefunden\0\bNull an Position 59 gefunden\0\bNull an Position 60 gefunden\0\bNull an Position 61 gefunden\0\bNull an Position 62 gefunden\0\bNull an Position 63 gefunden\0\bNull an Position 64 gefunden\0\bNull an Position 65 gefunden\0\bNull an Position 66 gefunden\0\bNull an Position 67 gefunden\0\bNull an Position 68 gefunden\0\bNull an Position 69 gefunden\0\bNull an Position 70 gefunden\0\bNull an Position 71 gefunden\0\bNull an Position 72 gefunden\0\bNull an Position 73 gefunden\0\bNull an Position 74 gefunden\0\bNull an Position 75 gefunden\0\bNull an Position 76 gefunden\0\bNull an Position 77 gefunden\0\bNull an Position 78 gefunden\0\bNull an Position 79 gefunden\0\bNull an Position 80 gefunden\0\bNull an Position 81 gefunden\0\bNull an Position 82 gefunden\0\bNull an Position 83 gefunden\0\bNull an Position 84 gefunden\0\bNull an Position 85 gefunden\0\bNull an Position 86 gefunden\0\bNull an Position 87 gefunden\0\bNull an Position 88 gefunden\0\bNull an Position 89 gefunden\0\bNull an Position 90 gefunden\0\bNull an Position 91 gefunden\0\bNull an Position 92 gefunden\0\bNull an Position 93 gefunden\0\bNull an Position 94 gefunden\0\bNull an Position 95 gefunden\0\bNull an Position 96 gefunden\0\bNull an Position 97 gefunden\0\bNull an Position 98 gefunden\0\bNull an Position 99 gefunden\0Null an Position 100 gefunden\0Null an Position 101 gefunden\0Null an Position 102 gefunden\0Null an Position 103 gefunden\0Null an Position 104 gefunden\0Null an Position 105 gefunden\0Null an Position 106 gefunden\0Null an Position 107 gefunden\0Null an Position 108 gefunden\0Null an Position 109 gefunden\0Null an Position 110 gefunden\0Null an Position 111 gefunden\0Null an Position 112 gefunden\0Null an Position 113 gefunden\0Null an Position 114 gefunden\0Null an Position 115 gefunden\0Null an Position 116 gefunden\0Null an Position 117 gefunden\0Null an Position 118 gefunden\0Null an Position 119 gefunden\0Null an Position 120 gefunden\0Null an Position 121 gefunden\0Null an Position 122 gefunden\0Null an Position 123 gefunden\0Null an Position 124 gefunden\0Null an Position 125 gefunden\0Null an Position 126 gefunden\0Null an Position 127 gefunden\0Null an Position 128 gefunden\0Null an Position 129 gefunden\0Null an Position 130 gefunden\0Null an Position 131 gefunden\0Null an Position 132 gefunden\0Null an Position 133 gefunden\0Null an Position 134 gefunden\0Null an Position 135 gefunden\0Null an Position 136 gefunden\0Null an Position 137 gefunden\0Null an Position 138 gefunden\0Null an Position 139 gefunden\0Null an Position 140 gefunden\0Null an Position 141 gefunden\0Null an Position 142 gefunden\0Null an Position 143 gefunden\0Null an Position 144 gefunden\0Null an Position 145 gefunden\0Null an Position 146 gefunden\0Null an Position 147 gefunden\0Null an Position 148 gefunden\0Null an Position 149 gefunden\0Null an Position 150 gefunden\0Null an Position 151 gefunden\0Null an Position 152 gefunden\0Null an Position 153 gefunden\0Null an Position 154 gefunden\0Null an Position 155 gefunden\0Null an Position 156 gefunden\0Null an Position 157 gefunden\0Null an Position 158 gefunden\0Null an Position 159 gefunden\0Null an Position 160 gefunden\0Null an Position 161 gefunden\0Null an Position 162 gefunden\0Null an Position 163 gefunden\0Null an Position 164 gefunden\0Null an Position 165 gefunden\0Null an Position 166 gefunden\0Null an Position 167 gefunden\0Null an Position 168 gefunden\0Null an Position 169 gefunden\0Null an Position 170 gefunden\0Null an Position 171 gefunden\0Null an Position 172 gefunden\0Null an Position 173 gefunden\0Null an Position 174 gefunden\0Null an Position 175 gefunden\0Null an Position 176 gefunden\0Null an Position 177 gefunden\0Null an Position 178 gefunden\0Null an Position 179 gefunden\0Null an Position 180 gefunden\0Null an Position 181 gefunden\0Null an Position 182 gefunden\0Null an Position 183 gefunden\0Null an Position 184 gefunden\0Null an Position 185 gefunden\0Null an Position 186 gefunden\0Null an Position 187 gefunden\0Null an Position 188 gefunden\0Null an Position 189 gefunden\0Null an Position 190 gefunden\0Null an Position 191 gefunden\0Null an Position 192 gefunden\0Null an Position 193 gefunden\0Null an Position 194 gefunden\0Null an Position 195 gefunden\0Null an Position 196 gefunden\0Null an Position 197 gefunden\0Null an Position 198 gefunden\0Null an Position 199 gefunden\0Keine Null gefunden!";
    

  • Mod

    Für Lokalisierung müssen wir natürlich beachten, dass alles was bisher im Thread vor kam nur schlecht lokalisierbar war. Wir wollen dafür schließlich etwas in der Art von printf. Der Einfachheit halber nehme ich dann auch mal printf.

    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    
    int main()
    {
      const char * const english_main = "Found %s zero\n";
      const char *english_yes_no[] = {"a", "no"};
      const char * const german_main = "%s Null gefunden\n";
      const char *german_yes_no[] = {"Eine", "Keine"};
    
      const char* main;
      const char** yes_no;
    
      std::srand(std::time(0));
      if (std::rand() % 2)
        {
          main = english_main;
          yes_no = english_yes_no;
        }
      else
        {
          main = german_main;
          yes_no = german_yes_no;
        }
    
      std::printf(main, (std::rand() % 2)[yes_no]);
    }
    

    Kekse! 😋


Log in to reply