説明タイトル: int型のsqrt(int型x)関数実現。計算戻るxは非負の整数であり、xの平方根。戻り型が整数であるため、結果の整数部は、小数部を切り捨て保持します。
例:入力出力2 8
具体的なアイデア:
Aは考えた:二分法。X / 2の平方根よりも小さくなければならないX 2より数の大きい、のいずれか。したがって、二分法を使用します。
1 クラスソリューション: 2 DEF mySqrt(自己、X:INT) - > INT: 3 あれば、X <2 : 4 リターンX 5 =右、左、0であり、X 6は ながら(= <左、右): 7 ミッド=(左+右)// 2 #//向下取整除法 8 かの半ば*半ば== X: 9 リターン半ば 10 もし中旬*中旬> X: 11 、右=半ば-1 12 他: 13 左=ミッド+ 1つの 14 リターン右 15
時間複雑:OのO(LOGN)スペースの複雑さ(1)
思考II:次のアイデアは数学に有利になるように偏った問題を参照するソリューションです。再帰的方法+ 2ビット演算を考えます。
ここに2を乗じ及び2で割ったビット演算で表される非常に巧妙です。
1 クラスソリューション: 2 DEF mySqrt(セルフ、X:INT) - > INT: 3 IF X <2 : 4 リターンX 5 。左self.mySqrt =(X >> 2)1 << #ここで、再帰的計算 。6 右左+ 1 = #それの考えを与えられた後、それは見落として簡単ですが、 7 リターンは左IF右*右> X- 他に右 8
思考3:ニュートン法。奇妙な賢いです。
1 クラスソリューション: 2 DEF mySqrt(セルフ、X:INT) - > INT: 3 IF X <2 : 4 リターンX 5 X0 = X 6 X1 =(X0 + X / X0)/ 2 。7 一方 ABS(X0-X1 )> = 1: #最終的な結果は少なくとも1の整数によって異なる、整数であるので、 図8 X0 = X1 9 X1 =(X0 + X / X0)/ 2 #反復式 10 リターン INT(X1)