先放代码:

#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. 新手入门,望得到老手的指导。谢。

有缺陷的一元三次方程求解设计(盛金公式)相关推荐

  1. 一元三次方程求解(盛金公式)

    一元三次方程求解(盛金公式) #include<iostream> #include<cmath> #include<iomanip> using namespac ...

  2. NOIP 2001 一元三次方程求解(二分||盛金公式)

    题目描述 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝 ...

  3. 用盛金公式求解一元三次方程

    解一元三次方程一般用盛金公式求解,算法高效且求出来的解精确.     百度百科关于盛金公式有如下解释: 盛金公式 Shengjin's Formulas 一元三次方程aX^3+bX^2+cX+d=0, ...

  4. P1024 一元三次方程求解 牛顿迭代+盛金公式+二分+勘根定理

    P1024 一元三次方程求解 传送门 题目描述 有形如:ax^3+bx^2+cx^1+dx^0=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实 ...

  5. MATLAB实现一元三次方程求解/盛金公式

    MATLAB实现一元三次方程求解/盛金公式 一元三次方程求解中,1945年卡尔丹诺把冯塔纳的三次方程求根公式发表出来,但该公式形式比较复杂,直观性也较差.1989年范盛金对一元三次方程求解进行了深入的 ...

  6. C# 盛金公式 求解一元三次方程

    class dd2{private static readonly double dsr3 = Math.Sqrt(3);// <summary>/// 盛金公式求解一元三次方程,ax^3 ...

  7. 洛谷 P1024 一元三次方程求解 (暴力 or 二分 or 盛金公式)

    P1024 一元三次方程求解 题意 有形如:ax3+bx2+cx+d=0ax^3+bx^2+cx+d=0ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,da, ...

  8. 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根

    对于一元二次方程 ,我们由求根公式可得: . 对于一元三次方程 ,我们有 卡尔丹公式法和盛金公式法.不过公式比较冗长.不易计算,但我们还是有方法计算的,那么如果是一元四次.一元五次甚至更高呢? 遇到高 ...

  9. 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)

    卡尔丹公式法 特殊型一元三次方程 X^3+pX+q=0 (p.q∈R) 判别式Δ=(q/2)2+(p/3)3 卡尔丹公式 X1=(Y1)(1/3)+(Y2)(1/3) X2= (Y1)(1/3)ω+( ...

最新文章

  1. Gogs 0.11.19 发布,自助 Git 托管服务
  2. VS.NET2005中的WEBPART初步(一)
  3. AndroidStudio中如何打开hierarchyviewer.bat
  4. 如何使用可外部化的接口在Java中自定义序列化
  5. 博弈论笔记--03--迭代剔除和中位选民定理
  6. Hibernate 常见异常
  7. BBC英语-drama
  8. 服务器系统重置,云服务器系统重置
  9. 周末ROS学习沙龙第三期——launch文件、自定义服务通信、控制机器人移动、传感器数据处理
  10. 全国乡镇边界及名称的下载与格式转换方法(水经注万能地图X3.1+CASS10.1.5组合拳)
  11. DirectX游戏开发之3D角色动起来(上)
  12. android加载dex方法,[原创]分享一个快速加载dex文件的方法
  13. js 金额格式化 和 转成人民币大写金额形式
  14. matlab运行.m文件的命令,怎样在matlab的命令窗口运行.m文件
  15. 算法渐近性质分析_神奇宝贝解释的渐近分析:深入研究复杂性分析
  16. Xman pwn level2 writeup
  17. 爬虫实战:英雄联盟手游能“干掉”王者荣耀?微博4.3亿网友吵翻了……
  18. 十分钟搞定时间复杂度(算法的时间复杂度)
  19. 安卓手机卡顿怎么解决_苹果七系统内存满了手机卡顿解决方法
  20. RabbitMQ的分发机制

热门文章

  1. 江工网:江苏省公务员一年能考几次
  2. 浅谈垂直搜索引擎技术
  3. Android的SocketTCP客户端发送信息
  4. 【银行】2016年中国银行信息科技岗 笔试+面试经验汇总
  5. 损失来自粗心 巧设置避免WMP11误删文件
  6. 敏捷测试的“三板斧“
  7. Virus_LPK专杀
  8. 职称计算机考试报名交费好,不去考了,可以申请退款么?如果可以的话,怎么退?,2021年初级会计报名缴费问题汇总,不想考可以退费吗?...
  9. Eu3 地图查看器 V1.7(2012.2.5更新),支持 CK2、SGK、Vic2:AHD、HOI3:FTM
  10. 广州移动MGV2000_爱家TV_S905L3_安卓9.0_线刷固件包