搜索
bottom↓
回复: 9

这个改成C#困难么?

[复制链接]

出0入0汤圆

发表于 2009-3-28 15:39:01 | 显示全部楼层 |阅读模式
//求解任意一元三次方程 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;

void  quadratic_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;

}





void  quadratic_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;
       
}

出0入0汤圆

发表于 2009-3-28 15:44:04 | 显示全部楼层
可以用托管C++编译好后,再反编译成C#,呵呵

出0入0汤圆

发表于 2009-3-28 16:52:34 | 显示全部楼层
这个可以被编译为纯.NET代码.
要改成C#的,估计要DIY一个复数操作类型。

(原文件名:1.jpg)

出0入0汤圆

发表于 2009-3-28 17:58:04 | 显示全部楼层
LS的是Win7哦~呵呵

出0入0汤圆

发表于 2009-3-28 18:24:26 | 显示全部楼层
楼上的楼上好炫的桌面!

出0入0汤圆

 楼主| 发表于 2009-3-28 20:20:00 | 显示全部楼层
哪位辛苦一下,帮我修改成C#吧,谢谢!

出0入0汤圆

发表于 2009-3-28 20:30:42 | 显示全部楼层
实际上并不要那么复数类型,只要输出的时候加个字符串i就行了,我原来用C实现过,改成C#应该不是太蛮烦。

下面是我刚刚移植的:

(原文件名:截图00.jpg)
源码包:
点击此处下载 ourdev_429585.rar(文件大小:36K) (原文件名:一元三次方程求解.rar)

出0入0汤圆

 楼主| 发表于 2009-3-29 15:51:22 | 显示全部楼层
太谢谢啦,哈哈,我正需要这样的界面

出0入0汤圆

发表于 2009-3-29 19:22:30 | 显示全部楼层
我程序里的算法貌似还是有点bug的,例如会出现0i,0i是个实数了,而且不是方程的根。

出0入0汤圆

 楼主| 发表于 2009-3-30 08:16:59 | 显示全部楼层
太谢谢了,我在百度也看见你了,给你留言了:)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 11:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表