这个改成C#困难么?
//求解任意一元三次方程 a*x^3+b*x^2+c*x+d=0//输入a,b,c,d;输出三个解分别为x1,x2,x3
//
#include<complex>
#include<iostream>
#include<math.h>
using namespace std;
voidquadratic_equation(double a4,double b4,double c4,complex<double> &z1,complex<double> &z2);
int main()
{
float a,b,c,d;
double p,q,delta;
double M,N;
complex<double> temp1,temp2;
complex<double> x1,x2,x3;
complex<double> y1,y2;
cout<<" please input the coefficients a, b, c, d : ";
cin>>a>>b>>c>>d;
//输入一元三次方的系数,得方程为a*x^3+b*x^2+c*x+d=0;
if(a==0)
{
quadratic_equation(b,c,d,y1,y2);
x1 = y1;
x2 = y2;
x3 = 0;
std::cout<<" x1="<< x1 <<endl;
std::cout<<" x2="<< x2 <<endl;
std::cout<<" x3="<< x3 <<endl;
}
else
{
p = -1.0/3*pow((b*1.0/a),2.0)+c*1.0/a;
q = 2.0/27*pow((b*1.0/a),3.0)-1.0/3*b*c/(a*a)+d*1.0/a;
// p = -1/3*(b/a)^2+c/a;
// q = 2/27*(b/a)^3-1/3*b*c/(a*a)+d/a;
//化成 y^3+p*y+q=0 形式
delta = pow((q/2.0),2.0)+pow((p/3.0),3.0);
//判别式 delta = (q/2)^2+(p/3)^3;
cout<<" delta>0,有一个实根和两个复根;delta=0,有三个实根;delta<0,有三个不等的实根"<<endl;
cout<<" 判别式的值 delta="<<delta<<endl;
//delta>0,有一个实根和两个复根;
//delta=0,有三个实根;
//delta<0,有三个不等的实根。
complex<double>omega1(-1.0/2, sqrt(3.0)/2.0);
complex<double>omega2(-1.0/2, -sqrt(3.0)/2.0);
complex<double>yy(b/(3.0*a),0.0);
M = -q/2.0;
if(delta<0)
{
N = sqrt(fabs(delta));
complex<double>s1(M,N);
complex<double>s2(M,-N);
x1 = (pow(s1,(1.0/3))+pow(s2,(1.0/3)))-yy;
x2 = (pow(s1,(1.0/3))*omega1+pow(s2,(1.0/3))*omega2)-yy;
x3 = (pow(s1,(1.0/3))*omega2+pow(s2,(1.0/3))*omega1)-yy;
std::cout<<" x1="<< x1 <<endl;
std::cout<<" x2="<< x2 <<endl;
std::cout<<" x3="<< x3 <<endl;
//输出结果 x1=y1-b/(3*a); x2=y2-b/(3*a); x3=y3-b/(3*a);
}
else
{
N = sqrt(delta);
//cout<<" please output the M+N="<<M+N<<endl;
//cout<<" please output the M-N="<<M-N<<endl;
//M+N= -q/2+sqrt((q/2)^2+(p/3)^3);
//M-N= -q/2-sqrt((q/2)^2+(p/3)^3);
complex<double>f1(M+N,0);
complex<double>f2(M-N,0);
if(M+N >= 0)
temp1 = pow((f1),1.0/3);
else
temp1 = -norm(pow(sqrt(f1),1.0/3));
if(M-N >= 0)
temp2 = pow((f2),1.0/3);
else
temp2 = -norm(pow(sqrt(f2),1.0/3));
x1 = temp1+temp2-yy;
x2 = omega1*temp1+omega2*temp2-yy;
x3 = omega2*temp1+omega1*temp2-yy;
std::cout<<" x1="<< x1 <<endl;
std::cout<<" x2="<< x2 <<endl;
std::cout<<" x3="<< x3 <<endl;
//输出结果 x1=y1-b/(3*a); x2=y2-b/(3*a); x3=y3-b/(3*a);
}
}
return 0;
}
voidquadratic_equation(double a4,double b4,double c4,complex<double> &z1,complex<double> &z2)
{
double delta;
complex<double> temp1,temp2;
delta=b4*b4-4*a4*c4;
complex<double> temp(delta,0);
temp1 = (-b4)/(2*a4);
temp2 = sqrt(temp)/(2*a4);
z1=temp1+temp2;
z2=temp1-temp2;
} 可以用托管C++编译好后,再反编译成C#,呵呵 这个可以被编译为纯.NET代码.
要改成C#的,估计要DIY一个复数操作类型。
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_429534.jpg
(原文件名:1.jpg) LS的是Win7哦~呵呵 楼上的楼上好炫的桌面! 哪位辛苦一下,帮我修改成C#吧,谢谢! 实际上并不要那么复数类型,只要输出的时候加个字符串i就行了,我原来用C实现过,改成C#应该不是太蛮烦。
下面是我刚刚移植的:
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_429584.jpg
(原文件名:截图00.jpg)
源码包:
点击此处下载 ourdev_429585.rar(文件大小:36K) (原文件名:一元三次方程求解.rar) 太谢谢啦,哈哈,我正需要这样的界面 我程序里的算法貌似还是有点bug的,例如会出现0i,0i是个实数了,而且不是方程的根。 太谢谢了,我在百度也看见你了,给你留言了:)
页:
[1]