Question:
Implement
int sqrt(int x)
.
Compute and return the square root of x .
Anwser 1: 二分法
class Solution {
public:
int sqrt(int x) {
if(x < 0) return -1; // assert(x >= 0);
long long x2 = (long long)x;
long long left = 0;
long long right = x2;
long long mid = 0;
while(left <= right){
mid = left + (right - left) / 2;
if(mid * mid == x2 || (mid * mid < x2 && (mid + 1) * (mid + 1) > x2)){
return (int)mid;
} else if(mid * mid < x2){
left = mid + 1;
} else{
right = mid - 1;
}
}
}
};
注意點(diǎn):
1) 非負(fù)數(shù)判斷,負(fù)數(shù)沒有開平方根
2) 取值范圍,mid = left + (right - left) / 2; 可能會(huì)超過int最大取值范圍,因此需設(shè)mid類型為long long(C++沒ulong)
Anwser 2: 牛頓迭代法
class Solution {
public:
int sqrt(int x) {
if(x < 0) return -1; // assert(x >= 0);
double n = x;
while(abs(n * n - x) > 0.0001){
n = (n + x / n) / 2;
}
return (int)n;
}
};
注意點(diǎn):
求a的平方根問題,可以轉(zhuǎn)化為x^2 - a = 0 求x值,進(jìn)而 abc(x^2 -a) < 0.0001 (0.0001為接近精度)
令 f(x) = x^2 - a, f(x) 即是精度取值范圍(無限趨近于0)
對(duì) 函數(shù) f(x) 求導(dǎo):
變換公式,得:
把f(x) = x^2 - a 公式求導(dǎo),導(dǎo)入得: Xn+1 = Xn - (Xn^2 - a) / (2Xn) = Xn - (Xn - a/Xn) / 2 = (Xn + a/Xn) / 2
其中, Xn+1 無限接近于 Xn, 即有: Xn = (Xn + a/Xn) / 2
Anwser 3: 火星人算法
#include <stdio.h>
int InvSqrt(int x)
{
float x2 = (float)x;
float xhalf = x2 / 2;
int i = *(int*) & x2; // get bits for floating VALUE
i = 0x5f375a86 - (i>>1); // gives initial guess y0
x2 = *(float*) & i; // convert bits BACK to float
x2 = x2 * (1.5f - xhalf * x2 * x2); // Newton step, repeating increases accuracy
x2 = x2 * (1.5f - xhalf * x2 * x2); // Newton step, repeating increases accuracy
x2 = x2 * (1.5f - xhalf * x2 * x2); // Newton step, repeating increases accuracy
printf("\n\n1/x = %d\n", (int)(1/x2));
return (int)(1/x2);
}
int main(){
//InvSqrt(65535);
InvSqrt(10);
InvSqrt(2147395599);
InvSqrt(1297532724);
return 0;
}
說明:
此方法傳說非常高效,我是參考別人的float寫的int(參數(shù))
在gcc(linux)下編譯通過,且測(cè)試結(jié)果都正確,但在leetcode編譯沒通過,編譯顯示信息如下:
參考推薦:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

