方法1:二分迭代法
#include <cstdio>
#include <iostream>
#include <algorithm>
#define eps 1e-8
using namespace std;
double n;
double fun(double mid)
{return mid*mid*mid<n?1:0;}
int main()
{
cin>>n;
double l=0,r=n,mid;
if(n<0) swap(l,r);
while(r-l>eps){ //当精度未达到1e-8即10-8时,二分逼近
mid=(l+r)/2;
if(fun(mid)) l=mid; //小的话
else r=mid;
}
printf("%.6f\n",r);
}
方法二:牛顿迭代法
不断用(x,f(x))的切线来逼近
#include <iostream>
#include <cstdio>
using namespace std;
int mabs(int a)
{
if(a<0) a=-a;
return a;
}
double sqrt(double c)
{
double err = 1e-8; //设立精度
double t = c;
while (mabs(c - t*t*t) > err) t =t-(t*t*t-c)/(3.000*t*t); //三次方的递推公式
return t;
}
int main()
{
int n;
cin>>n;
printf("%.6lf",sqrt(n));
return 0;
}