数值分析-开方公式
// 开方公式
#include<bits/stdc++.h>
using namespace std;
int main()
{
double c, x0, jingdu;
printf("请输入被开方数c:");
scanf("%lf", &c);
printf("请输入初值x0:");
scanf("%lf", &x0);
printf("请输入精度(用小数表示):");
scanf("%lf", &jingdu);
double xk, xk1 = x0;
int i = 0;
do {
i++;
xk = xk1;
xk1 = 0.5 * (xk + c / xk);
printf("x%d = %lf\n", i, xk1);
} while (abs(xk1 - xk) > jingdu);
printf("故 √c ≈ x%d = %lf\n", i, xk1);
return 0;
}
二分逼近开方
#include<iostream>
using namespace std;
using ll = long long;
const int N = 5000 + 10;
int n;
int main()
{
double c, jingdu;
printf("------------------二分逼近------------------\n");
printf("请输入被开方数c:");
scanf("%lf", &c);
printf("请输入精度(用小数表示):");
scanf("%lf", &jingdu);
double l = 0, r = max(1.0, c), mid = 0;
int i = 0;
while(abs(mid * mid - c) > jingdu) {
i++;
mid = (l + r) / 2.0;
if (mid * mid < c) l = mid;
else r = mid;
printf("x%d = %lf\n", i, mid);
}
printf("故 √c ≈ x%d = %lf\n", i, mid);
return 0;
}
对比总结
二分逼近的复杂度是O(logN)*
开方公式的时间复杂度是O(k)=O(loglogN)**
开方公式的收敛速度更快。