我被告知此代码段相当于(int)sqrt(n)
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;
}
它似乎有效, 但我不明白它是如何工作的?
答案 0 :(得分:10)
它使用了x^2 = 1 + 3 + 5 + ... + (2*x-1)
这一事实。这里i
超过奇数,k
是他们的总和。当总和超过n
时,它会停止。此时i == (2*x-1) + 2
x
是平方根,所以x == floor(i/2)
。