您的位置:首页 > 其它

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

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

题目如下





解法如下:

#include <iostream>

double processData(double x, double *a, double*b, int count);
//calc the formula
//f(x)=a[0]* x^0 + a[1] * x^1 + ... + a
* 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;
}


计算结果如下



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

好在调试几次总算OK了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: