问题描述
编写一个求解一元二次方程的实数根的程序,方程的系数由用户在运行xh
输入格式
输入一行三个整数分别为一元二次方程的三个系数,数据之间以空格隔开
输出格式
输出一行为方程的实数根(若两根不同 较大的在前 两根以空格隔开 若两根相同 输出一个 若无根 输出 NO )
样例输入
1 -5 4
样例输出
4 1
样例输入
1 -2 1
样例输出
1
样例输入
1 0 1
样例输出
NO
問題解決のアイデア:
式の方法:
コードは次のように表示されます。
#include<stdio.h>
#include<math.h>
int main() {
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
double root=0,x1=0,x2=0;
root=b*b-4*a*c;
if(root>0){
x1=(-b+sqrt(root))/(2*a);
x2=(-b-sqrt(root))/(2*a);
if(x1>x2){
printf("%g %g",x1,x2);
}
}else if(root==0){
x1=(-b)/(2*a);
x2=x1;
printf("%g",x1);
}else{
printf("NO");
}
return 0;
}
この質問は、正確な出力に注意を払う必要があります。そうしないと、一部のデータにとっては悲しいことです。たとえば、2 51。
printf("%g %g",x1,x2);
このコード行で%gはどういう意味ですか。
%gは、C言語のprintf()関数の出力形式タイプです。%f%eでは、単精度および倍精度の実数が短い出力幅で出力されることを示します。%e形式は、指数が小さい場合に使用されます。 -4以上またはそれ以上の精度。
例えば
printf("%g\n", 0.00001234);
printf("%g\n", 0.0001234);
printf("%.2g\n", 123.45);
printf("%.2g\n", 23.45);
結果:
1.234e-05
0.0001234
1.2e+02
23