在python或标准库中是否存在整数平方根?我希望它是准确的(即返回一个整数),并且如果没有解决方案则吠叫.
目前我推出了自己的天真的:
def isqrt(n):
i = int(math.sqrt(n) + 0.5)
if i**2 == n:
return i
raise ValueError('input was not a perfect square')
Run Code Online (Sandbox Code Playgroud)
但它很难看,我不相信大整数.如果我超过了这个值,我可以遍历正方形并放弃,但我认为做这样的事情会有点慢.另外我想我可能正在重新发明轮子,这样的东西肯定已经存在于python ......
我需要编写程序来查找长度为数千位的数字的整数平方根.我不能使用Newton Raphson,因为我没有数据类型来存储和划分这么大的数字.我在C中使用长数组来存储数字.是否有任何算法可以通过迭代数字找到平方根?
编辑:
我不能像GMP一样使用外部库.
美好的一天,
我的一个朋友正在询问将整数平方根函数转换为元函数.这是原始功能:
unsigned isqrt(unsigned value)
{
unsigned sq = 1, dlt = 3;
while(sq<=value)
{
sq += dlt;
dlt += 2;
}
return (dlt>>1) - 1;
}
Run Code Online (Sandbox Code Playgroud)
我使用了一个元版本constexpr,但他说他出于某种原因无法使用新功能:
constexpr std::size_t isqrt_impl
(std::size_t sq, std::size_t dlt, std::size_t value){
return sq <= value ?
isqrt_impl(sq+dlt, dlt+2, value) : (dlt >> 1) - 1;
}
constexpr std::size_t isqrt(std::size_t value){
return isqrt_impl(1, 3, value);
}
Run Code Online (Sandbox Code Playgroud)
所以我认为将其转换为以递归方式调用它的模板结构应该不难:
template <std::size_t value, std::size_t sq, std::size_t dlt>
struct isqrt_impl{
static const std::size_t square_root =
sq <= …Run Code Online (Sandbox Code Playgroud)