求平方根的面試題
前幾天在網上看到有人曬一道面試題,寫一個函數求平方根,該函數帶2個參數,第一個參數是目標數字,第二個參數是精度。即:
- double sqrt(double target, double g);
- a = sqrt(t, g);
- // 要求 |a^2 - t| < g
原文看到題目,就沒有接著往下看,想了一會兒,就有思路了,覺得拿來做面試題不錯。可是沒想到面了好幾個人,都沒有人能給出稍微好看點的代碼。難道大家工作久了之後,寫代碼反而生疏了嗎?一直手癢,今晚就花了幾分鐘實現了一下,感覺還是比較簡單的。實現完成之後,感覺不錯,給出的答案都滿足要求了,程序應該是對了。但是後來仔細一思考,又打了些程序處理過程的trace出來,發現不對了,有bug. 什麽bug呢?收斂比較慢,和原來二分查找的設想不一樣。雖然也能給出結果,但是收斂慢了,程序的實現和自己的思路不一致。想了一會兒,給出了正確的代碼。該sqrt函數實現大約24行左右,如下:
- #include <iostream>
- using namespace std;
-
-
- #define abs(X) ((X) > 0 ? (X) : -(X))
-
- double sqrt(double target, double g)
- {
- if (target < 0 || g < 0) return -1;
-
- double result = target;
- double small = target > 1 ? 0 : target;
- double big = target > 1 ? target : 1;
-
- while
(true) { - double diff = result * result - target;
-
- if (abs(diff) < g) {
- break;
- }
- else if (diff > 0) {
- big = result;
- }
- else if (diff < 0) {
- small = result;
- }
- result = (big + small) / 2;
- }
- return
result; - }
-
- int main()
- {
- cout << "sqrt(10, 0.1) = " << sqrt(10, 0.1) << endl;
- cout << "sqrt(25, 0.001) = " << sqrt(25,0.001) << endl;
-
- cout << "sqrt(0.09, 0.001) = " << sqrt(0.09, 0.001) << endl;
- cout << "sqrt(0.4, 0.01) = " << sqrt(0.4, 0.01) << endl;
-
- return 0;
- }
求平方根的面試題
相關推薦
求平方根的面試題
style iostream namespace fff span lin ack color relative 前幾天在網上看到有人曬一道面試題,寫一個函數求平方根,該函數帶2個參數,第一個參數是目標數字,第二個參數是精度。即:double sqrt(double tar
面試題-不使用庫函式求開平方根
兩種方法: 1、採用二分法的方式,上界初始化為數字本身,下界初始化為1,這樣用二分,判斷中間數字的平方和目標數字比較,再修改上界和下界,直到小於一定的閾值。 2、採用牛頓法(數值分析中提到),採用微分的方式,從初始點開始,每次迭代,微分求解切線,然後求解切線和x軸的交點,
js面試題之求數組最值
pre 面試 可能 cti clas return n) ole arr 今天繼續分享js常見的面試題,求數組最大值,最小值,這裏列舉4種常見解法,還有其他方法也可以實現,讀者知道可以私信我,我將把意見列舉到博客中,歡迎提出意見。 第一種,利用數組排序 1 var arr
面試題11-求數值的整數次方
import str 整數 面試 1.0 pre pow col 類型 題目描述 給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。 代碼 import java.lang.Math; public cl
面試題11:求旋轉陣列的最小數字
題目:把一個數組最開始的若干個元素搬到陣列末尾,即陣列的旋轉; 例如:{3,4,5,1,2}是{1,2,3,4,5}的一個旋轉,輸出該陣列的最小值1 程式碼如下: #include<stdio.h> #include<stdlib.h> #include&
【面試題】求連結串列的環入口點
環入口點:我們設A是連結串列的起點,B是環的入口點,C是環內快慢指標的相遇點。兩個快慢指標定義為slow和fast. slow走的路程:A->B->C; fast走的路程:A->B->C->B->C; 2*(x+y)=x+y+z+y
【面試題】給多個無序正整數,求中位數
題目:給你很多很多正整數,但它們是無序的,找出它們的中位數。 最開始就想說使用快排,先將這些整數進行排序,然後找到中位數,但又想到可能不是面試官想要的答案,於是又採用了其他方法,最終也沒完全解決出來。 【經驗總結:當面試官問了一個演算法題後,如果想不到優化一點的方法,就先
劍指offer{面試題32:求從1到n的整數中1出現的次數}
思路:map.get獲得出現次數 import java.util.HashMap; public class Solution { public int FirstNotRepeatingChar(String str) { int len = str.length(); if(len =
多執行緒程式設計(二)——面試題,每個執行緒只打印一種字元,多個執行緒協同順序列印n次字串(求大神的其他實現方案)
(這個是歡聚時刻(YY)的筆試題,在筆試的時候沒有寫出來,後來自己寫了出來,希望大神能給出更優秀的解決方案……ps:現在面試官總有面試時問筆試程式設計題思路的習慣,呵呵) 題目簡述: 輸入一個字串以
C#面試題:求100以內的質數
質數是隻能被1和他本身整除的數。 for (int i = 1; i <= 100; i++) { for (int j = 2; j <=i; j++) {
面試題之旋轉陣列求最小數字問題(Python實現)
旋轉陣列求最小數字 問題描述: 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE
筆面試題之 求小於N的質數中和為N的質數對
輸入正整數N,若存在小於N的質數對(a,b),使得兩者之和為N,求這樣的質數對有多少? 這道題首先肯定是要求小於N的質數,將小於N的質數放入一個長度可變的資料結構,那麼這個資料結構中的整數們一定是有序的。 然後既然是有序的,就可以優化之讓兩個指標分別指向開頭
求中位數!面試題
1 兩個陣列x[]、y[],長度為n,而且都經過排序從小到大排列,請編寫C/C++程式求出兩個數組合並後(仍然從小到大排列)的中位數,要求比較次數少於n。 #include "iostream.h" #include "stdio.h" #define num 4 in
經典面試題——求任意兩個葉節點中最近的父節點
以下程式未經測試,僅供參考! #include <iostream> #include <vector> using namespace std; struct LCATreeNode{ LCATreeNode* m_pLeft; LC
【每日面試題】給定一個字串,求出其最長的重複子串
題目:給定一個字串,求出其最長的重複子串 如字串abcdabcabcd,求的最長重複子串為abcd 程式碼: void LongChar(char* str) { if(str==NULL) return; int max=0; int first=0; int
sql 面試題 函式 求工資第n多的工資
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN RETURN ( select e1.Salary from (select distinct Salary fromEmpl
指標、陣列求值及面試題
一維陣列 int a[] = {1,2,3,4}; printf("%d\n",sizeof(a));//16 printf("%d\n",sizeof(a+0));//4 printf("%d\n",sizeof(*a));//4 a代表的是首元素的地址,*a就是首元素。 pri
面試題,求一個整數陣列中和最大的連續子陣列,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大連續子陣列是[4, 10, -3, 4](需寫明思路,並程式設計實現)
php實現: function get_max_value($arr) { $max_sum=0;//最大的值 $max_start=0;//和最大子陣列開始下標 $max_end=
【面試題】求包含n個節點(從1到n,n個節點)的所有二叉搜尋樹
二叉搜尋樹滿足的條件 當前根節點的值大於左子樹節點的值 當前根節點的值小於右子樹節點的值 左右子樹同樣是二叉搜尋樹 根據上述規則可以看出,根節點值不同,形成的二叉搜尋樹就不同,那麼[1:n]範圍內的n個數就有n個不同的選擇。 [1:i−1]這i-1
二叉樹面試題--已知二叉樹的兩種遍歷序列,求出另一種遍歷序列
已知先序遍歷序列和中序遍歷序列,求出後序序列 或者 已知中序序列和後序序列 , 求出先序遍歷。。都是一些考試中容易考的題目。 經過研究發現,已知先序序列和後序序列,無法唯一確定一棵樹,所以就無