求X的算术平方根
啊,本菜狗今天又一道简单题,结果本菜狗一如既往的只会最简单的操作,最后看一些大佬的题解,最后整理了一下,准备记录一下。
给定X,求其算是平方根(默认整数哈)。
如 x = 10,最后输出 3 。
方法一(sqrt(x))函数
直接调用sqrt(x)函数即可,便可以直接运算出答案。(这也是本菜狗看到题目后第一瞬间想到的方法)
int x;
cin>>x;
cout<<int(sqrt(x))<<endl;
输入:19
输出:4
这个就是直接调用函数就可以了,没有什么好说的。
方法二 二分查找法
对从0 到 x的数进行二分查找,找出X的算术平方根。
因为我们是找的整数型,所以我们在最后返回的时候,应该是返回第一个平方大于X的数的左侧。
即 假定 x=8 ,第一个平方大于x的是3,所以返回3左侧的数 2。
因为8本身的平方根就是2.82843,将2.82843取整,也就得到了2。
int TSqrtX(int x){//二分查找版
int low = 0;
int high = x-1;
while(low<=high){
int middle=low + (high - low)/2;//middle每次为高位低位的一半
if(middle == x/middle){
return middle;
}else if(middle > x/middle){
high = middle - 1;
}else{
low = middle + 1;
}
}
return high;//返回high,因为最后high的位置就是大于X的数的左侧。
}
方法三 指数对数互换
根据指数对数互换原则可以得到这个结论。
之后再根据exp函数和log函数进行求取就行。因为涉及到精度浮点的问题,所以要进行浮点比较。就可以了。
上代码
int elog(int x){//数学版
if(x==0)return 0;
long long result= exp(0.5*log(x));
return ((result+ 1) * (result+ 1) <= x ? result+ 1 : result);
}
方法四 牛顿迭代法
采用牛顿迭代法进行求根。
设函数为
进行一阶泰勒展开得
带入公式进行计算得出
即只要xn+1 与xn的差值进行收敛即可
上代码:
int NRmethod(int x){//牛顿迭代法
if(x==0)return 0;
double c = x ,xi = x;
while(true){
double xn = 0.5*(xi+c/xi);
if(fabs(xn-xi)<1e-7){//fabs求绝对值
break;
}
xi=xn;
}
return (int)xi;
}
结语
啊,本菜狗又是水题的一天