这题我就用binary search做的,用牛顿迭代法应该更快。
解法1: binary search
注意:
1) 当x=INT32_MAX时,long long j=x+1会等于0。因为x+1还是integer,溢出后等于0,所以要加(long long)。
2) mid^2<=x<=(mid+1)^2时,要注意是否应该返回x+1。
3) j的上界可能不需要到x+1,下次要仔细想想。
#include <iostream>
using namespace std;
int mySqrt(int x) {
long long i=0, j=(long long)x+1; //if j=x+1, then j=0!!!
while(i<j) {
long long mid=i+(j-i)/2;
if (mid*mid > x) {
j=mid;
}else if ((mid+1)*(mid+1)<x) {
i=mid+1;
}else { //mid^2<=x<=(mid+1)^2
if ((mid+1)*(mid+1)==x) return mid+1;
return mid;
}
}
}
int main()
{
cout<<mySqrt(4)<<endl;
cout<<mySqrt(9)<<endl;
cout<<mySqrt(10)<<endl;
cout<<mySqrt(2147395599)<<endl;
cout<<mySqrt(2147483647)<<endl; //maximum of INT_32!
return 0;
}解法2: 牛顿迭代法 (下次补充)
本文介绍了使用二分查找(binary search)和牛顿迭代法(Newton's method)两种方法来求解整数平方根的问题。通过C++代码实现并演示了如何找到一个整数的平方根,特别注意了边界条件和溢出问题。
1972

被折叠的 条评论
为什么被折叠?



