您的位置:首页 > 编程语言

#问题求解与编程# 实验1 B 一元二次方程问题

2018-06-12 23:33 225 查看
4000


一元二次方程问题

时间限制: 1000ms   内存限制: 128M

描述

类似以下这种形式的方程称一元二次方程:a*x^2+b*x+c=0现在给出a,b,c,求出方程的两个解。

输入

输入有多组数据,每组数据占一行,输入三个整数a,b,c。(-100<=a,b,c<=100,a不等于0)

输出

每组输出占一行,对应每组输入输出结果,具体格式参见样例,x1为结果较大的数,x2为结果较小的数(如果两个解相同,需一同输出,参见样例),结果保留两位小数。

样例输入1
1 -1 -6
样例输出1
x1=3.00, x2=-2.00
样例输入2
1 -2 1
样例输出2
x1=1.00, x2=1.00
样例输入3
1 2 3
样例输出3
No solution!
样例输入4
-1 0 0
样例输出4
x1=0.00, x2=0.00
样例输入5
1 2 -4
样例输出5
x1=1.24, x2=-3.24
提示本题为多组数据,请参考以下输入格式:while (scanf("%d %d %d", &a, &b, &c) != EOF) {    //...}可以通过sqrt函数来开根号,注意该函数的头文件是math.h。大家注意一下,x1=-0.00, x2=-0.00出现这样的情况是错误的,必须输出x1=0.00, x2=0.00还要判断根的大小!大家可以用这样的方法判断:if(fabs(x1)<1e-6) x1=0;if(fabs(x2)<1e-6) x2=0;   (1e-6 就相当于 10^-6,fabs函数是绝对值函数,例如x=-3;fabs(x)的值为3),做乘除法的时候也得记得用 *1.0,例如5*1.0/3,大家注意一下精度问题!!!
————————————————————————————————————————————————————以上为原题,这是自下学期开课以来我们进行的第一次真正的编程练习,一元二次方程,看上去不难,但是还是卡了我一下,问题主要还是处在对计算机判断求得的解是否为零的方式,没有真正明白。判断解为零的方式。此外,应当注意乘除法的精度问题以及int double类等最基本的运算求解方式。
此处为AC代码,没有什么思考的难度,此外,还是要注意输入输出。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Delta  b*b-4*a*c
int main()
{
int a,b,c;
double x1,x2,temp;
while(scanf("%d %d %d", &a, &b, &c)!=EOF){

if (Delta >= 0)
{
x1=(-b+sqrt((double)Delta))/(2*(double)a);
x2=(-b-sqrt((double)Delta))/(2*(double)a);
if(x1<x2)
{temp=x1;x1=x2;x2=temp;}
if(fabs(x1)<1e-6) x1=0;if(fabs(x2)<1e-6) x2=0;
printf("x1=%.2lf, x2=%.2lf\n", x1,x2);
}
else
{
printf("No solution!\n");
}
}
return 0;
}
此处为标程代码。
#include<cstdio>
#include<cmath>
float max(float a,float b){return a-b>1e-6?a:b;}
float min(float a,float b){return a-b<1e-6?a:b;}
int main()
{
//freopen("data.in","r",stdin);
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
int t=b*b-4*a*c;
if(t<0)
{
printf("No solution!\n");
continue;
}
float sq=sqrt(t*1.0);
float x1=(-1.0*b+sq)*1.0/(2.0*a);
float x2=(-1.0*b-sq)*1.0/(2.0*a);
if(fabs(x1)<1e-6) x1=0;
if(fabs(x2)<1e-6) x2=0;
printf("x1=%.2f, x2=%.2f\n",max(x1,x2),min(x1,x2));
}
return 0;
}


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: