C语言OJ项目参考(2013)一元二次方程Ⅱ

(2013)一元二次方程Ⅱ
Description
求一元二次方程ax 2 +bx+c=0 的解。a,b,c为任意实数。
Input
输入数据有一行,包括a b c的值。
Output
按以下格式输出方程的根x1和x2。x1和x2之间有一个空格。 x1 x2
(1)如果x1和x2为实根,则以x1>=x2输出。
(2)如果方程是共轭复根,x1=m+ni,x2=m-ni,其中n>0。 其中x1, x2, m,n均保留2位小数。
Sample Input
1 2 3
Sample Output
-1.00+1.41i -1.00-1.41i
[参考解答]

#include <stdio.h>
#include <math.h>
int main ( )
{
    float a,b,c,d,pr,pi,x1,x2;
    scanf("%f %f %f",&a,&b,&c);
    d=b*b-4*a*c;
    if(d>=0)
    {
        x1=(-b+sqrt(d))/(2*a);
        x2=(-b-sqrt(d))/(2*a);
        printf("%.2f %.2f\n",x1,x2);
    }
    else
    {
        pr=-b/(2*a);
        pi=sqrt(-d)/(2*a);
        printf("%.2f+%.2fi ",pr,pi);
        printf("%.2f-%.2fi\n",pr,pi);
    }
    return 0;
}

完善:
  以上结果提交OJ顺利通过,尽管自知对共轭复根处的处理有点太简单,但通过了,也乐得不追究了。
  今天(2016年10月13日)上机课上,崔翔童鞋问我,题目中有“(2)如果方程是共轭复根……,其中n>0”,那个n>0怎么整,惊出一身冷汗:老贺想逃避,休想!
  读上面的程序,其实可以看到,当a<0时,共轭复根的虚部pi<0,于是输出的结果,就会很难看。确切的说,是错的!
  如下图:
  这里写图片描述
  这样的输出,太低级了。我们想要的是:
  这里写图片描述
  但是,最爱在输出格式上和人较劲的OJ,是怎么容忍这样的错误的?很简单,没有提供a<0时的测试数据,自然就让人能蒙混过关了。OJ啊,你那严格的名声来之不易,咋能不珍惜呢?
  不管你OJ了,老贺决定认真点。你让人犯错,咱也不降低对自己的要求了。上代码:

#include <stdio.h>
#include <math.h>
int main ( )
{
    float a,b,c,d,pr,pi,x1,x2;
    scanf("%f %f %f",&a,&b,&c);
    d=b*b-4*a*c;
    if(d>=0)
    {
        x1=(-b+sqrt(d))/(2*a);
        x2=(-b-sqrt(d))/(2*a);
        printf("%.2f %.2f\n",x1,x2);
    }
    else
    {
        pr=-b/(2*a);
        pi=sqrt(-d)/(2*a);
        if(a>0)
        {
            printf("%.2f+%.2fi ",pr,pi);
            printf("%.2f-%.2fi\n",pr,pi);
        }
        else
        {
            printf("%.2f+%.2fi ",pr,-pi);
            printf("%.2f-%.2fi\n",pr,-pi);
        }
    }
    return 0;
}

  其实,考虑共轭复根的对称性,可以如下省点代码(读起来难懂,就运行观察观察,再想想):

#include <stdio.h>
#include <math.h>
int main ( )
{
    float a,b,c,d,pr,pi,x1,x2;
    scanf("%f %f %f",&a,&b,&c);
    d=b*b-4*a*c;
    if(d>=0)
    {
        x1=(-b+sqrt(d))/(2*a);
        x2=(-b-sqrt(d))/(2*a);
        printf("%.2f %.2f\n",x1,x2);
    }
    else
    {
        pr=-b/(2*a);
        pi=sqrt(-d)/(2*a);
        if(a<0) //这儿利用了共轭复根的对称性,反正输出那个形式就行
            pi=-pi;
        printf("%.2f+%.2fi ",pr,pi);
        printf("%.2f-%.2fi\n",pr,pi);
    }
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值