我被告知这段代码片段等同于(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; } 看起来它能够正常工作,但我不明白它是如何工作的?
它利用了这样一个事实:x^2 = 1 + 3 + 5 + ... + (2*x-1)。 这里的i遍历奇数,k是它们的总和。 当总和超过n时停止。此时i == (2*x-1) + 2,其中x是平方根,因此x == floor(i/2)。
n
接近INT_MAX
时,代码会失败。无论如何,对于大数值,它需要很长时间才能运行。存在更快的方法。 - chux - Reinstate Monica