私が整数を持っていて、その数の二乗が よりも小さいn
最大の数を見つけたいとしましょう。m
n
この問題の最適な解決策は何ですか?
「最適解」はめったに存在しませんが、かなり高速なアルゴリズムは次のとおりです (名前を知っている人はいますか? )、それはバビロニア法と呼ばれます。
int num = 4567;
int r1 = num / 2;
int r2 = 2;
while (std::abs(r2 - r1) > 1) {
r2 = (r1 + r2) / 2;
r1 = num / r2;
}
ここでr1
とr2
は、平方根の下側近似と上側近似です。あなたの場合、小さい方が必要です。
整数部分を探しているだけなので、次のように行うことができます。
int n = 123; //or whatever you want
int m = 1;
while (m * m <= n) {
m = m + 1;
}
return (m - 1);