如何使用java語言求一個正整數的平方根碟嘴?(不使用庫函數)

今天的這篇文章是我在刷算法題的時候遇到的,最簡單的方法是直接調用java里面的Sqrt函數错沃,不過有時候題目中會要求我們不能使用庫函數雀瓢,所以在這里我們自己定義Sqrt方法。

最常見的思路有兩種刃麸,第一種是二分法泊业,第二種是牛頓的微積分思想。沒錯脱吱,想當年大學時候學了很久很痛苦的微積分,被我第一次派上用場了续捂。對于這兩種方法我們一個一個看宦搬。

一、二分法

二分法的思想很簡單矾克,就是從0到N不斷的去縮小范圍來找一個一個滿足精度的最佳值憔足。我們舉一個函數的例子:

1.jpg

這就是二分法的思想酒繁,求平方根也是控妻,我們從0到value取出中間值弓候,然后不斷地比較,假設value=10菇存,查找區(qū)間為(0,10)亥至,這時候燃佟(0,10)的中間值mid=5,mid*mid再和value比較之后,確定下一次查找的區(qū)間變?yōu)椋?杯缺,5),依次類推袍榆。一直到滿足我們需要的精度即可塘揣。下面我們使用java代碼實現一下:

    static double MySqrt(int value, double t){
        if (value < 0 || t<0)
            return 0;
        double left = 0;
        double right = value;
        double mid = (right + left) / 2;
        double offset = 2*t ;
        while (offset>t){
            double temp = mid*mid;
            if (temp > value){
                right = (left + right) / 2;
                offset = temp - value;
            }
            if (temp <= value){
                left = (left + right) / 2;
                offset = value - temp;
            }
            mid = (left + right) / 2;
        }
        return mid;
    }

在這里value就是我們要求的數字亲铡,t表示的是精度。這個方法在這奖蔓,大家可以測試一遍。不過在這里有一個小小的問題需要我們去注意:

如果我們對整數9取平方根厨疙,結果不是3疑务,這里有精度損失梗醇,損失的原因之一是和計算機有關的叙谨,因為計算機的底層其實只有0和1牙肝,所以會無限的接近,而不能精確表示配椭。

以上就是二分法求解的思想,這個思想很簡單衡楞,不過實現的方法卻是有一點點麻煩敦姻。在這里我們開始介紹第二種方法,那就是牛頓的微積分思想
二迷守、牛頓迭代法

牛頓的微積分的思想就是無限接近旺入,在這里提一句,如果你是數學大佬就不要追究思想到底是啥了礼华。對于求平方根來說拗秘,使用切線來無限逼近的方式有時候能起到意想不到的效果。

設r是f(x) = 0的根扮匠,選取x0作為r初始近似值凡涩,過點(x0,f(x0))做曲線y = f(x)的切線L,

L的方程為y = f(x0)+f'(x0)(x-x0)帮非,求出L與x軸交點的橫坐標 x1 = x0-f(x0)/f'(x0),稱x1為r的一次近似值末盔。

過點(x1,f(x1))做曲線y = f(x)的切線陨舱,并求該切線與x軸交點的橫坐標 x2 = x1-f(x1)/f'(x1),稱x2為r的二次近似值游盲。

重復以上過程,得r的近似值序列谜慌,其中x(n+1)=x(n)-f(x(n))/f'(x(n))莺奔,稱為r的n+1次近似值,上式稱為牛頓迭代公式恼琼。

我們使用一張圖來演示一下:


2牛頓.png

這種方式也很好理解屏富。所以我們直接來看實現:

static double SqrtIterator(int value,double t){
    double temp = value;
    while (fabs(temp*temp-value)>t){
        temp=(temp+value/temp) / 2.0;
    }
    return temp;
}
//取絕對值
private static double fabs(double a) {
    return (a < 0) ? -a : a;
}

上面的方法同樣可以表示狠半。而且我們可以看到,牛頓的這個方法其實更加的簡單。而且精度也更好乐严。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末昂验,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子既琴,更是在濱河造成了極大的恐慌甫恩,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奖慌,死亡現場離奇詭異,居然都是意外死亡建椰,警方通過查閱死者的電腦和手機岛马,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伞矩,“玉大人蹦浦,你說我怎么就攤上這事〗耐啵” “怎么了溉贿?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵宇色,是天一觀的道長。 經常有香客問我宣蠕,道長,這世上最難降的妖魔是什么镀层? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任唱逢,我火速辦了婚禮屋休,結果婚禮上,老公的妹妹穿的比我還像新娘痪枫。我一直安慰自己,他們只是感情好听怕,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布尿瞭。 她就那樣靜靜地躺著,像睡著了一般黑竞。 火紅的嫁衣襯著肌膚如雪疏旨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天遏匆,我揣著相機與錄音谁榜,去河邊找鬼。 笑死窃植,一個胖子當著我的面吹牛,可吹牛的內容都是我干的葛超。 我是一名探鬼主播延塑,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼关带,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起端朵,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤冲呢,失蹤者是張志新(化名)和其女友劉穎舍败,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡邻薯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年裙戏,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厕诡。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡累榜,死狀恐怖,靈堂內的尸體忽然破棺而出灵嫌,到底是詐尸還是另有隱情壹罚,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布寿羞,位于F島的核電站猖凛,受9級特大地震影響绪穆,放射性物質發(fā)生泄漏辨泳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一玖院、第九天 我趴在偏房一處隱蔽的房頂上張望菠红。 院中可真熱鬧,春花似錦司恳、人聲如沸途乃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耍共。三九已至,卻和暖如春猎塞,著一層夾襖步出監(jiān)牢的瞬間试读,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工荠耽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钩骇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓铝量,卻偏偏與公主長得像倘屹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慢叨,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容