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;
}
时间: 2024-08-01 22:05:36

C语言OJ项目参考(2013)一元二次方程Ⅱ的相关文章

C语言OJ项目参考(1047) 最大公约数和最小公倍数

1047: 求两个整数的最大公约数和最小公倍数 Description 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入. Input 两个数 Output 最大公约数 最小公倍数 Sample Input 6 15 Sample Output 3 30 HINT 主函数已给定如下,提交时不需要包含下述主函数 /* C代码 */ int main() { int n,m,gys,gbs; int gcd(int a, int b); int

C语言OJ项目参考(2000)数组逆序

Description 输入10个整数存入一维数组,按逆序重新存放后再输出. Input 输入包括一行.10个以空格隔开的整数. Output 逆序的10个整数,整数以空格隔开. Sample Input 1 3 5 9 7 6 8 2 4 0 Sample Output 0 4 2 8 6 7 9 5 3 1 提示:在OJ平台中,将有一个格式错误可能会让你崩溃.友情提示:输出的最后一个数字后面没有空格. 参考解答: #include <stdio.h> int main() { int a[

C语言OJ项目参考(2966) 循环画三角形

2966: 循环画三角形 Description 前几天,老师让良哥做一个画空心三角形的程序来取悦小师妹,可把良哥愁死了,C语言基础学得再扎实,算法不精也是硬伤呀!于是良哥又写好了主程序来找机前的你帮忙了^_^ #include <stdio.h> void holl_triangle(int n); /*函数声明*/ int main() { int n; scanf("%d",&n); /*输入行数n*/ holl_triangle(n); /*调用输入n行的空

C语言OJ项目参考(1992)分数序列

(1992)分数序列 Description 有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, -编写程序求出这个序列的前n项之和. Input 输入只有一个正整数n,1≤n≤10. Output 输出该序列前n项和,结果保留小数后6位. Sample Input 3 Sample Output 5.166667 参考解答 #include <stdio.h> int main ( ) { int m1=2,m2=1, n, t, i; double sum=2; scanf

C语言OJ项目参考(1034) 求值

(1034) 求值 Description 求Sn=1!+2!+3!+4!+5!+-+n!之值,其中n是一个数字. Input n Output 和 Sample Input 5 Sample Output 153 参考解答 #include <stdio.h> int main ( ) { int n, i; long fact=1, sum=1; scanf("%d",&n); for(i=2;i<=n;i++) { fact=fact*i; sum+=f

C语言OJ项目参考(1056)输出已交换后的两个值

1056: (用宏)输出已交换后的两个值 Description 定义一个带参的宏(或者模板函数),带有三个参数,第一个参数为类型,后两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. Input 两个短整型数,空格隔开 两个小数,空格隔开 两个长整数,空格隔开 Outputt 交换后的两个数,空格隔开 Sample Input 1 2 1.5 2.5 65535 2147483647 Sample Outputt 2 1 2.5 1.5 2147483647 6

C语言OJ项目参考(2965)趣味取小数

2965: 趣味取小数 Description 听说大家最近学得不错,教授就准备考考大家,先做出来有奖哦~ 编写一个函数,取一个小数的第n(-10<=n<=16)位,当n大于0时,从小数点位置开始向右取小数部分第n位,当n小于0时,从小数点位置开始向左取整数部分的第n位. #include <stdio.h> #include <string.h> int get_one_digit(double num,int n); /*函数声明*/ int main() { do

C语言OJ项目参考(2021)汉诺塔

2021: 汉诺塔 Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说.开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A.B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面.僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬了 聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗? Input 输入金片的

C语言OJ项目参考(2962) 日期妙算星座

2962: 日期妙算星座 Description 近几年星座运势十分流行,据说一年之中根据月份可以分出十二个星座,它们分别是:摩羯座(12.21-1.19),水瓶座(1.20-2.18),双鱼座(2.19-3.20),白羊座(3.21-4.19),金牛座(4.20-5.20),双子座(5.21-6.21),巨蟹座(6.22-7.22),狮子座(7.23-8.22),处女座(8.23-9.22),天秤座(9.23-10.23),天蝎座(10.24-11.22),射手座(11.23-12.21),猴