実装 int sqrt(int x)
。
計算の平方根を返す X、 xは 非負の整数であることが保証されます。
戻り型が整数であるため、小数点以下の桁が切り捨てられ、その結果の整数部のみが返されます。
例1:
入力:4 出力:2
例2:
入力:8 出力:2 説明:8の平方根は2.82842で...、そして以来、 小数部分は切り捨てられ、2が返されます。
効果の件名:
xが求めている所定の非負整数xの平方根
理解:
方法の一つ:I = 1からの暴力行為は、私は条件を満たし見つけ、振り返って開始します。<= X &&(I + 1)*(I + 1)> X iはi *が満たすべき
しかしながら、このような欠点がある、すなわち、私はINT_MAXを超える*。これは、x / I> = iは&& X /(I + 1)<(i + 1)のように書かなければなりません
この方法の効率は非常に低く、特にとき大きなX。
方法2:方法と同様の二分法により、条件を満たした平方根の半ばを見つけます。
最初の区間[0、X]:中間値の中間部、
X /ミッド<中期、中期、右の間隔
X /ミッド=半ばには、半ばは、xの平方根である場合には
場合X /ミッド>中間、か否かを判定するX /(中間+ 1)<(中間+ 1)、X満たす中間の平方根を、そうでない場合、左ミッド間隔
現在の中間中間部分の値を更新しました。効率が大幅に良いです。
コードC ++:
この方法の一つ:
クラス解決{ パブリック: INT mySqrt(INT X){ もし(x == 0 || X == 1)リターンX。 以下のために(int型 i = 1 ; iが<= X / 2 ; ++ I){ 場合(X / iは> = iはX /(iは+ && 1)<(iは+ 1 )) リターンI。 } 戻りX; } }。
方法2:
クラス解決{ パブリック: INT mySqrt(INT X){ もし(x == 0 || X == 1)リターンX。 INT =左0、右= X、ミッド= X; しながら、(左<= 右){ 半ば =(左右)/ 2 + 左右。 もし(X /ミッド< MID){ 右 = ミッド。 } そう であれば(X /ミッド== MID){ リターン中間と、 }他{ 場合(X /(中間+ 1)<(中間+ 1 )) リターンミッド。 左 = 半ば; } } 戻りX; } }。
結果:
方法:とき実行:240 MSのメモリ消費量: 8.3メガバイト
方法2:実行: 0 MSの メモリ消費量: 8.3メガバイト