您将获得一个整数n和一个有理数p/q(其中p和q是整数)。
如何比较sqrt(n)和p/q?
解决方案1:sqrt(n) <= (double)p / q。这应该可以工作,但调用sqrt比仅使用乘法/除法慢。
解决方案2:(double)n * q * q <= p * p。更好,但我认为因为我们使用浮点数,如果p/q非常接近sqrt(n),我们可能会得到错误的答案。此外,它需要将整数转换为浮点数,这比仅使用整数稍微慢一些。
解决方案3:n*q*q <= p*p。更好,但如果p和q变得很大,就会遇到问题,因为会发生溢出(通常,如果在使用64位整数时p或q >= 2^32)。
解决方案4:使用具有无限制整数的bignum库/编程语言的解决方案3。
解决方案5:(q/p)*n <= p/q。成功避免了任何溢出问题,但我不确定在所有情况下都正确,因为涉及整数除法...
所以...我愿意采用解决方案2或4,但我想知道是否有聪明的技巧来解决这个问题,或者是否有证明(或反例)表明解决方案5有效(或无效)。
如何比较sqrt(n)和p/q?
解决方案1:sqrt(n) <= (double)p / q。这应该可以工作,但调用sqrt比仅使用乘法/除法慢。
解决方案2:(double)n * q * q <= p * p。更好,但我认为因为我们使用浮点数,如果p/q非常接近sqrt(n),我们可能会得到错误的答案。此外,它需要将整数转换为浮点数,这比仅使用整数稍微慢一些。
解决方案3:n*q*q <= p*p。更好,但如果p和q变得很大,就会遇到问题,因为会发生溢出(通常,如果在使用64位整数时p或q >= 2^32)。
解决方案4:使用具有无限制整数的bignum库/编程语言的解决方案3。
解决方案5:(q/p)*n <= p/q。成功避免了任何溢出问题,但我不确定在所有情况下都正确,因为涉及整数除法...
所以...我愿意采用解决方案2或4,但我想知道是否有聪明的技巧来解决这个问题,或者是否有证明(或反例)表明解决方案5有效(或无效)。
n = 4; p = 2; q = 1;
预期结果:sqrt(n) == p/q;
实际结果:(1 / 2) * 4
使用整数除法得到的结果是4
,而2/1
的结果是2
,因此4 <= 2
是错误的。 - Niet the Dark Absol