2016-12-17 2 views
7

Ich habe diesen Code-Schnipsel gesagt entspricht (int)sqrt(n)seltsame Art und Weise Quadratwurzel der Berechnung

int s(int n) { 
    for (int i = 1, k = 0; n > 0; i += 2) { 
     if (k + i > n) 
      return i/2; 
     k += i; 
    } 
    return 0; 
} 

Und es zu funktionieren scheint, aber ich verstehe nicht, wie es funktioniert?

+5

Ich stimme für das Schließen dieser Frage als Off-Topic, weil dies eine mathematische Frage ist, keine Programmierfrage. Versuchen Sie math.stackexchange.com. – Barmar

+0

Hinweis: Code schlägt bei 'n' in der Nähe von' INT_MAX' zu groß aus. IAC, für große Zahlen dauert es sehr lange. Schnellere Methoden existieren. – chux

+0

Wenn Sie das seltsam finden, sollten Sie die höchst bizarren Algorithmen in wissenschaftlichen Taschenrechnern sehen. Selbst nachdem sie stundenlang studiert haben, gibt es keinen Schimmer, wie sie tun, was sie tun! – wallyk

Antwort

10

Es nutzt die Tatsache, dass x^2 = 1 + 3 + 5 + ... + (2*x-1). Hier geht i über die ungeraden Zahlen und k ist ihre Summe. Es stoppt, wenn die Summe mehr als n ist. An dieser Stelle i == (2*x-1) + 2 wo x ist die Quadratwurzel, also x == floor(i/2).

Verwandte Themen