大家应该都知道,在$C++$中有这么一个专门求平方根的函数,叫sqrt
具体操作如下:
#include <bits/stdc++.h>
using namespace std;
double n;
int main() {
cin >> n;
cout << sqrt(n) << endl;
return 0;
}
那么,这个封装好的函数内部又该是怎样的呢?
很明显,我们应当知道,对于一个任意非负数$n$来说,其平方根只能在$0$到$n$之间,很容易想到二分
具体操作如下:
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-15;
double n;
double Sqrt(double x) {
double lft = 0, rgt = x, ans = 0;
while (abs(lft - rgt) > eps) {
double mid = (lft + rgt) / 2.0;
if (mid * mid <= x)
ans = lft = mid;
else
rgt = mid;
}
return ans;
}
int main() {
cin >> n;
cout << Sqrt(n) << endl;
return 0;
}
然而,如果题目很死板地要求我们具体输出某一位怎么办?
假设题目要求我们输出保留小数点后6位
最简单的方法是用printf
具体操作如下:
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-15;
double n;
double Sqrt(double x) {
double lft = 0, rgt = x, ans = 0;
while (abs(lft - rgt) > eps) {
double mid = (lft + rgt) / 2.0;
if (mid * mid <= x)
ans = lft = mid;
else
rgt = mid;
}
return ans;
}
int main() {
cin >> n;
printf("%.6lf", Sqrt(n));
return 0;
}
但是,万一题目让你输出保留小数点后$d$位呢?
这个时候printf
就不怎么管用了
由于double
的精度并不算高,所以$d$可以取$0~15$,从而可以枚举$0$到$15$位的情况
不过,这个方法并不高端,就算用switch
也并不合算
这个时候就要看一看万众瞩目的cout
了
具体操作如下:
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-15;
double n;
int d;
double Sqrt(double x) {
double lft = 0, rgt = x, ans = 0;
while (abs(lft - rgt) > eps) {
double mid = (lft + rgt) / 2.0;
if (mid * mid <= x)
ans = lft = mid;
else
rgt = mid;
}
return ans;
}
int main() {
cin >> n >> d;
cout << fixed << setprecision(d) << Sqrt(n) << endl;
return 0;
}
注意:当$d<15$时,会四舍五入,当$d=15$时,会向下取整
还有更多的方法可以看洛谷上的题解,立方根和平方根其实是一个意思
mod,还更新了
woc,牛逼,有一种豁然开朗的感觉!!!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
好氵牛顿迭代法
pow(n,0.5) (狗头)