先放代码:
#include <cmath>
#include <iostream>
//cube_sqrt.h
double abs(double x)
{
if(x<=0)
x=-x;
return x;
}
double cube_sqrt(double x)
{
if(x==0)
return 0;
double y, z;
y=x;
z=0;
double middle;
if(abs(x)>=1)
middle=sqrt(abs(x));
else if(x<1)
middle=sqrt(sqrt(abs(x)));
if(x<0)
middle=-middle;
for(int i=0; i<1000; ++i)
{
if(middle*middle*middle == x)
return middle;
else if(abs(middle*middle*middle) < abs(x))
z = middle;
else if(abs(middle*middle*middle) > abs(x))
y = middle;
middle = (y+z)/2;
}
return middle;
}
#include <cmath>
#include <vector>
#include "cube_sqrt.h"
using namespace std;
//equation_solution.h
vector<double> equation_solution_1(double a, double b, double c, double d)
{
vector<double> result;
double A = b*b-3*a*c;
double B = b*c-9*a*d;
double C = c*c-3*b*d;
double D = B*B-4*A*C;
if(A==B&&B==0)
{
for(int i=0; i<3; ++i)
result.push_back(-b/(3*a));
return result;
}
else if(D>0)
{
double Y1 = A*b+1.5*a*(-B+sqrt(D));
double Y2 = A*b+1.5*a*(-B-sqrt(D));
result.push_back((-b-cube_sqrt(Y1)-cube_sqrt(Y2))/(3*a));
result.push_back((-b+0.5*(cube_sqrt(Y1)+cube_sqrt(Y2)))/(3*a));
result.push_back((0.5*sqrt(3)*(cube_sqrt(Y1)-cube_sqrt(Y2)))/(3*a));
result.push_back((-b+0.5*(cube_sqrt(Y1)+cube_sqrt(Y2)))/(3*a));
result.push_back((-0.5*sqrt(3)*(cube_sqrt(Y1)-cube_sqrt(Y2)))/(3*a));
return result;
}
else if(D==0)
{
result.push_back(-b/a+B/A);
for(int i=0; i<2; ++i)
result.push_back(-B/A/2);
return result;
}
else if(D<0)
{
double co = cos((acos((2*A*b-3*a*B)/(2*sqrt(A*A*A))))/3);
double sn = sin((acos((2*A*b-3*a*B)/(2*sqrt(A*A*A))))/3);
result.push_back((-b-2*sqrt(A)*co)/(3*a));
result.push_back((-b+sqrt(A)*(co+sqrt(3)*sn))/(3*a));
result.push_back((-b+sqrt(A)*(co-sqrt(3)*sn))/(3*a));
return result;
}
}
#include <iostream>
#include <vector>
#include "equation_solution.h"
using namespace std;
// equation_solution_main.cpp
int main()
{
cout << "您好!本程序专供求解三次方程,仅供学习和参考。" << endl;
cout << "本程序仅处理方程的一般形式:ax^3+bx^2+cx+d=0" << endl << endl;
double a, b, c, d;
while(true)
{
system("pause");
cout << "\n请输入三次项系数:";
cin >> a;
cout << "请输入二次项系数:";
cin >> b;
cout << "请输入一次项系数:";
cin >> c;
cout << "请输入常数项:";
cin >> d;
cout << "以下是方程的解:";
vector<double> result = equation_solution_1(a,b,c,d);
if(result.size()==3)
{
for(int i=0; i<3; ++i)
cout << "x" << (i+1) << "=" << result[i] << endl;
}
if(result.size()==5)
{
if(result[2]>0)
cout << "x1=" << result[0]
<< "\nx2=" << result[1] << "+" << result [2]
<< "i\nx3=" << result[3] << result [4]
<< "i" << endl;
else if(result[2]<0)
cout << "x1=" << result[0]
<< "\nx2=" << result[1] << result [2]
<< "i\nx3=" << result[3] << "+" << result [4]
<< "i" << endl;
}
cout << "求解完毕。\n" << endl;
}
return 0;
}
如标题,本一元三次方程求解运用的是盛金公式。速度较快,资源占用率也较低。
.NET的电脑不在身边,在一台古董上测试。Windows XP Visual C++ 6.0 测试通过。
两个小时做下来,感想如下:
1. abs运用了函数重载,C++标准库函数abs只支持int类型,不符合需求。
2. 立方根运用的是迭代(二分法),C++标准库函数pow函数精度不符合要求且不支持负数。
3. 没有做判别式无解判别,原因是没有必要。
4. 不是图形界面,仅为内核;控制台应用程序的cout还是花了较多时间设计的,尽量友好。
5. 重大缺陷:只支持方程的一般式,最终目标应为实现三次以下各类一元方程的求解。
6. 新手入门,望得到老手的指导。谢。