今日做一面試題目,寫一平方根squareroot函式,函式介面為:
unsigned int squareroot(unsigned int input); //不考慮float情況
經過思考,用位移的方法,乙個整數32bits,那麼平方根最多16bits,那麼對於這16個bits,從最大權重的bit開始,看是置1還是置0,一步一步往後走,到最後乙個bit被置完之後,平方根也就求出了。
那麼如何判斷後16bits中,某乙個特定的bit是0還是1呢?
這樣判斷,因為從most significant到least significant,那麼首先將當前需要判斷的bit置1,然後平方,看比input是否大,如果置1了都不比input大,那麼說明還需要右面的(less significant)bits們幫忙來接近平方根。簡單說一句,先將該位置1,平方,如果小於等於input,那麼該位就需要置1;否則,置0。
那麼接下來,就是見證**的時刻:
#include usingnamespace
std;
typedef unsigned
intuint;
uint squareroot(uint
input);
intmain()
uint squareroot(uint
input)
return
answer;
}
中途曾經出過乙個問題,問題發生於squareroot()函式中的第7行:
if ( ((answer + (1《一開始對於其中的 (1 考慮定義在兩正整數上的函式ssr 平方根之和的平方 ssr a,b sqrt a sqrt b 2。牛牛對函式值為整數的情況很感興趣。現在給定整數n和m,請幫助牛牛計算有序對 a,b 的數量,滿足1 a n,1 b m而且ssr a,b 是乙個整數。這道題本質上是要求sqrt ab 是整數,也就是要... 在3d圖形程式設計中,經常要求平方根或平方根的倒數,例如 求向量的長度或將向量歸一化。c數學函式庫中的sqrt具有理想的精度,但對於3d遊戲程式來說速度太慢。我們希望能夠在保證足夠的精度的同時,進一步提高速度。carmack在quake3中使用了下面的演算法,它第一次在公眾場合出現的時候,幾乎震住了... 加一點注釋 unsigned short work unsigned int n 要進行開平方運算的物件 unsigned int ans 0 開平方運算的結果 unsigned int square 0 記錄中間產生的平方值 unsigned short r 0 程式最終的返回結果 for int...平方根問題
快速平方根演算法
求平方根函式