zoj 3488 conic section

1036 ワード

テーマはzoj 3488を参照
簡単な問題なのに、一度もできなかった.問題に入力されたデータが実数であることがよく見えなかったからだ.
この問題は浮動小数点数の比較を考察する(浮動小数点数はコンピュータに記憶するのは近似記憶であるため,直接2つの浮動小数点数を直接記号より大きいか小さいかで比較することはできない)
 
 
/* zoj 3488 conic section */
#include <stdio.h>
#include <math.h>

#define SMALLNUM 1e-8

int main(void)
{
  double a,b,c,d,e,f;
  int n;
  
  scanf("%d", &n);
  while(n-- > 0)
    {
      scanf("%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &e, &f);
      if(fabs(a-c) < SMALLNUM)
	printf("circle
"); else if(a * c < -SMALLNUM) printf("hyperbola
"); else if(a * c > SMALLNUM) printf("ellipse
"); else printf("parabola
"); } return 0; }