牛顿迭代法求平方根

时间:2023-01-07 21:43:49
/*
试建立一个类 TRI,给出三角形的三边长,求三角形的面积.规定只能调用类自身的函数求平方根(不能使用库函数 sqrt()).具体要求如下:
(1) 私有数据成员
double a,b,c; 存放三角形三边长
(2) 公有成员函数
构造函数;初始化三边长度,并给出三边的缺省值为 1.假定给出的三边能构成三角形.
double sqroot(double m); 用牛顿迭代法求 m 的平方根.
double farea(); 求三角形的面积,要求调用 sqroot 函数求平方根.
void print(); 输出三角形的三边长,求出并输出三角形的面积.
(3) 在主函数中完成对该类的测试.定义一个 TRI 类的对象 san,三角形的三边长分别为 3,4,5,调用 print()函数输出该三角形的三条边长和面积.
*/


/*
假设a。欲求a的平方根,首先猜测一个值X1=a/2,然后根据迭代公式X(n+1)=(Xn+a/Xn)/2,算
出X2,再将X2代公式的右边算出X3等等,直到连续两次算出的Xn和X(n+1)的差的
绝对值小于某个值,即认为找到了精确的平方根。
*/


#include<iostream>
#include<cmath>
using namespace std;

class TRI
{
private:
double a, b, c;
public:
TRI(double, double, double);
double sqroot(double);
double farea();
void print();
};

TRI::TRI(double x = 1, double y = 1, double z = 1)
{
a = x;
b = y;
c = z;
}

double TRI::sqroot(double m)
{
//注意题目要求是迭代法而不是递归法
double result = 0.1;
while (abs(result*result - m) > 1e-5)
{
int temp = m / result;
result = (temp + result) / 2;
}
return result;
}

double TRI::farea()
{
double s = (a + b + c) / 2;
return sqroot(s*(s - a)*(s - b)*(s - c));
}

void TRI::print()
{
cout << "三边分别为" << a << "\t" << b << '\t' << c << endl;
cout << "面积为" << farea() << endl;
}

int main()
{
TRI tri(3, 4, 5);
tri.print();
system("pause");
return 0;
}