1. 程式人生 > 實用技巧 >【坑題】一元二次方程

【坑題】一元二次方程

原題傳送門

題目描述

小籠包在寫數學作業,練習冊上有一道一元二次方程求解。題目給定了一個形如 Ax2+Bx+C=0 的方程,並且給出了A,B,C的值。

小籠包實在不會,於是他便請求你幫他寫這題。作為回報,小籠包會請你吃小籠包。

輸入格式

第一行輸入三個整數A,B,C,表示方程的係數。
(−105<=A,B,C<=105)

輸出格式

有無窮多解輸出-1。
找不到任何一個值使得等式成立,輸出0。
有實數解:第一行解的數量,接下來的若干行,每行一個實數解,升序排列,保留後6位。

樣例輸入

1 1 -2

樣例輸出

2
-2.000000
1.000000

說點啥

這道題看上去很簡單,但是真的難爆了!!!要是不能因為能通過看沒通過的測試點不斷改錯,撓禿頂了你也想不到你錯在哪裡!簡直自閉到爆,浮點型別運算竟然會得到-0.000000的結果,我的天啊,竟然會會考這種小特性,必須加上一句if(fabs(x)<1e-9)x=fabs(x)。可怕!

Code

#include<iostream>
#include<stdio.h>
#include<math.h> 
using namespace std;
double d,a,b,c,ans1,ans2;
int main()
{
	cin>>a>>b>>c;
	d=b*b-4*a*c;
	if(a==0)
	{
		if(b==0&&c==0)cout<<"-1"<<endl;
		else if(b==0&&c!=0)cout<<0<<endl;
		else if(fabs(-c/b)<1e-9) cout<<1<<endl<<"0.000000"<<endl;
		else printf( "1\n%.6f\n",-c/b );
	}
	else
	{
		if(d<0)	
			cout<<0<<endl;
		else if(d==0)
		{
			ans1=-b/(2*a);
			if(fabs(ans1)<1e-9)ans1=fabs(ans1);
			printf( "1\n%.6f\n",ans1 );
		}
		else if(d>0)
		{
			ans1=(-sqrt(d)-b)/(2*a);
			ans2=(sqrt(d)-b)/(2*a);
			if(fabs(ans1)<1e-9)ans1=fabs(ans1);
			if(fabs(ans2)<1e-9)ans2=fabs(ans2);
			if(ans1>ans2)swap(ans1,ans2);
			printf( "2\n%.6f\n",ans1); 
			printf( "%.6f\n",ans2);
		}
	}
	return 0;
}