• 【坑题】一元二次方程


    原题传送门

    题目描述

    小笼包在写数学作业,练习册上有一道一元二次方程求解。题目给定了一个形如 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
    %.6f
    ",-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
    %.6f
    ",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
    %.6f
    ",ans1); 
    			printf( "%.6f
    ",ans2);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    touchMove VS touchCancel
    svg viewbox 作用
    reactjs reactLink
    放开linux下的端口
    运算符重载函数作为类成员函数和友元函数 (转)
    MBean和MXBean 区别
    transfer-encoding
    CSRF
    vue知识拓展
    居中
  • 原文地址:https://www.cnblogs.com/gongdakai/p/13579597.html
Copyright © 2020-2023  润新知