你好,我是普林斯特。

计算机的所有东西都是人做出来的,别人能想得出来的,我也一定能想得出来,在计算机里头,没有任何黑魔法,所有的东西,只不过是我现在不知道而已,总有一天,我会把所有的细节,所有的内部的东西全都搞明白的。       ----翁恺老师

愿你成为部落最强大的战士…                                                  

问题 1028: [编程入门]自定义函数求一元二次方程

时间限制: 1Sec 内存限制: 128MB 提交: 4313 解决: 2317

题目描述
求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。
输入
a b c
输出
x1=? x2=?
样例输入
4 1 1
样例输出
x1=-0.125+0.484i x2=-0.125-0.484i

 

 

   
    一元二次方程
                   ax²+bx+c=0   (a≠0)
                     
    其求根依据判定式△的取值为三种   ( △=b²-4ac )
     
        1. △>0,方程有两个不相等的实数根;
         
            x1=[-b+√(△)]/2a;   //( △=b²-4ac )
            x2=[-b-√(△)]/2a;
         
        2. △=0,方程有两个相等的实数根;
            x1=x2=[-b+√(△)]/2a= -b/2a ;
         
        3. △<0,方程无实数根,但有2个共轭复根。
            x1=[-b+√(△)*i]/2a;   //( △=b²-4ac )
            x2=[-b-√(△)*i]/2a;

 

 注意控制格式,保留三位小数输出
 sqrt()开平方函数,参数为正数

 

参考:

#include"iostream" 
#include"cmath"   //调用sqrt()开平方函数
#include"cstdio"  //调用printf()控制格式化输出
using namespace std;
 
float x1,x2,a,b,c,z;
  
void func1(){  //大于零 
    x1=( -b+sqrt(z) )/( 2*a );
    x2=( -b-sqrt(z) )/( 2*a );
}
 
void func2(){  //等于零 
    x1=x2=( -b )/( 2*a );
}
 
void func3(){  //小于零 
    z=sqrt(-z);
    printf("x1=%.3f+%.3fi x2=%.3f-%.3fi\n",-b/(2*a),z/(2*a),-b/(2*a),z/(2*a));//这里的i指的是Δ<0时,会有连个共轭复数根,i表示复数根
}
 
int main(){
    cin>>a>>b>>c;
    z=b*b-4*a*c;
    if(z>0){
        func1();
    }else if(z<0){
        func3();
        return 0;
    }else{
        func2();
    }
    printf("x1=%.3f x2=%.3f\n",x1,x2);
    return 0;
}

 

 

 My code:

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    int D=b*b-4*a*c;
    float d,d0;
    if(D>=0)
        d=sqrt(D);
    else
        d0=sqrt(-D);
    if(D>0)
    {
        printf("x1=%.3f x2=%.3f",(-b+d)*1.0/(2*a),(-b-d)*1.0/(2*a));
    } 
    else if(D==0)
    {
        printf("x1=%.3f x2=%.3f",(-b)*1.0/(2*a),(-b)*1.0/(2*a));//printf中的百分号%后的格式控制,是有用的,
    }        //像%f可以控制输出一个小数的格式,但是如果你后面应对于你真正输出的值就是一个整数,那么它近乎没有作用 
    else    //就像对于整除符号来说,用整除符号连接的表达式的结果,会自动转换成与被除数相同的类型 
            //整除运算符( / )需要注意的就是运算结果会自动转换为与被除数一致的数据类型。 
    {
        printf("x1=%.3f+%.3fi x2=%.3f-%.3fi",(-b*1.0)/(2*a),d0*1.0/(2*a),-b*1.0/(2*a),d0*1.0/(2*a));
    }
    return 0;
 } 

 

    printf("x1=%.3f+%.3fi x2=%.3f-%.3fi",(-b*1.0)/(2*a),d0*1.0/(2*a),-b*1.0/(2*a),d0*1.0/(2*a));
    
    复数有实部还有虚部
    复数的表示形式:“实部值+虚部值i ” 
    
    方程会有一对儿共轭复根,实部就是-b/(2*a) 虚部就是  (加或减)根号Δ/(2*a)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

期间出的一个关于生命区间的小错误,还是需要多多谨慎多多练习啊!

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    int D=b*b-4*a*c;
    if(D>=0)
        float d=sqrt(D);//在此处定义变量d,生命域就很有限,就只能在这个if语句中使用了 ,出了这个区间就会报错 
    else
        float d0=sqrt(-D);
    if(D>0)
    {
        printf("%.3f %.3f",(-b+d)/2*a,(-b-d)/2*a);
    } 
    else if(D==0)
    {
        printf("%.3f %.3f",(-b+d)/2*a,(-b+d)/2*a);
    }
    else
    {
        printf("%.3f+%.3f %.3f-%.3f",-b/2*a,d0/2*a,-b/2*a,d0/2*a);
    }
    return 0;
 } 
/*

*/

 

posted @ 2019-10-06 04:12  珞珈山  阅读(790)  评论(0)    收藏  举报