一道计算一元二次方程解的算法题

今天在群里有人求助一道求解一元二次方程的题目。尝试着写了一下,发现还挺容易犯错了。调试了几次总算OK了

题目如下

一道计算一元二次方程解的算法题_第1张图片

一道计算一元二次方程解的算法题_第2张图片


解法如下:

#include 

double processData(double x, double *a, double*b, int count);
//calc the formula
//f(x)=a[0]* x^0 + a[1] * x^1 + ... + a[n] * x^n = 0
double calcFormula(double *a, int count)
{
	if (count <= 0) return 0;
	//calc the f`(x)
	double * b = new double[count + 1];
	for (int i = 0; i <= count; ++i)
		b[i] = a[i] * i;

	double orgX = 0;
	double x = processData(orgX, a, b, count);
	while (abs(x - orgX) > 0.00001)
	{
		orgX = x;
		x = processData(orgX, a, b, count);
	}
	delete[] b;
	return x;
}

double processData(double x, double *a, double*b, int count)
{
	double fax = 0, fbx = 0;
	double product = 1;
	for (int i = 0; i <= count; ++i)
	{
		fbx += (b[i] * ((i <= 1) ? 1 : product));	
		product *= ((i == 0) ? 1 : x);
		fax += (a[i] * product);
	}
	return (x - fax / fbx);
}

int main()
{
	double a[] = { 1, -2.5, 0, 1 };
	int n = 3;
	std::cout << calcFormula(a, n) << std::endl;
    return 0;
}


计算结果如下
一道计算一元二次方程解的算法题_第3张图片


难度不算很高,,但是特别容易犯错。尤其是初值X为0的情况下可能遇到的情况。由于为了减少开销没有多次调用pow函数,而是自己写的累积乘积,特别容易出错。

好在调试几次总算OK了。

你可能感兴趣的:(Algorithm)