求X的算术平方根

求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;
}

结语

啊,本菜狗又是水题的一天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值