二分法与牛顿法
极限思想
算法实现:
double getE(double n){
double a = 1; //a为每一项的值
double e = a;
if (n==1) {
return e;
}
for (double i=1; i<=n; i++) {
a /= i; //后一项等于前一项处以i
e += a; //e等于各项值相加
}
return e;
}
double getPI(double n){
double a = sqrt(3)/3; //a纪录分子
double PI = a;
if (n==1) {
return PI;
}
for (double i=1; i<=n; i++) {
a = -a/3; //分子按照该方式迭代
PI += a/(2*i+1);
}
return 6*PI;
}
如何求√3呢?以下引出二分法和牛顿法
幂运算
- 题目描述:
leetcode 50
线性算法代码
double powLinear(double x, int n) {
double result = 1;
for (int i = 1; i <= n; i++) {
result *= x;
}
return result;
}
double myPowLinear(double x, int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return x;
} else {
if (n > 0) {
return powLinear(x, n);
} else {
return 1 / powLinear(x, -n);
}
}
}
logN算法代码
double plus_Pow(double x, int n) {
double ans = 1;
if (n==0) {
return ans;
}
double temp = plus_Pow(x, n/2); //这样计算的话就可以只计算一次;
if (n%2==0) {
ans = temp*temp; //如果这里temp写成plus_Pow(x, n/2);则该同样的式子将被计算多次
}
else
ans = temp*temp*x;
return ans;
}
double myPow(double x, int n){
if (n==0) {
return 1;
}
if (n==1) {
return x;
}
if (n>0) {
return plus_Pow(x, n);
}
else
return 1/plus_Pow(x, -n); //当n为负数时,计算相应的正数的幂函数后,取倒数
}
平方根
- 题目描述:
代码实现:
double round(double r)
{
return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
double mySqrt(double x){
double start = 0;
double end = x;
while (true) {
double mid = (start+end)/2;
if (fabs(mid-x/mid)<0.00001) { //c++中,求int型平均值用abs(); 求double型的用 fabs();
double temp = round(mid); //注意:c++中没有round函数,所以需要自己实现
if (temp==x/temp) { // 避免9的根号为2.9999的情况,也就是把所求的结果变为最近的整数,看看这个整数的平方是否为x;如果是,则返回这个整数
return temp;
}
else
return mid;
}
else if (mid < (x/mid)) {
start = mid;
}
else{
end = mid;
}
}
}
round() 函数的实现:
代码:
double myNewtonSqrt(double y){
double ans = y;
if (y==0||y==1) {
return ans;
}
while (true) {
if (fabs(ans-y/ans)<0.00001) { //c++中,求int型平均值用abs(); 求double型的用 fabs();
double temp = round(ans); //注意:c++中没有round函数,所以需要自己实现
if (temp==y/temp) { // 避免9的根号为2.9999的情况,也就是把所求的结果变为最近的整数,看看这个整数的平方是否为x;如果是,则返回这个整数
return temp;
}
else
return ans;
}
else{
ans = ans - (ans*ans-y)/(2*ans); //牛顿法递归求解
}
}
}
int mySqrt(int x){
if (x==0||x==1) {
return x;
}
double ans = x;
while (true) {
if (fabs(ans-x/ans)<1&&(floor(ans)-x/ans)<=0) {
return floor(ans);
}
else{
ans = ans - (ans*ans-x)/(2*ans); //牛顿法递归求解
}
}
}