第二題:一元三次方程式の解(NOIP 2009試験問題12.08)

1627 ワード


一元三次方程式の解
【問題説明】ax 3+bx 2+cx+d=0のような1元3次方程式が有形である.この方程式の各係数(a,b,c,dは実数)を与え、この方程式に3つの異なる実根(根の範囲は-100から100の間)が存在し、根と根の差の絶対値>=1が存在することを約束する.この3つの実根(根と根の間にスペースが残る)を小さいものから大きいものまで順次同じ行に出力することが要求されるを選択し、小数点以下2桁まで正確に指定します.ヒント:式f(x)=0を記し、2つの数x 1とx 2が存在し、x 1【入力】:(equation.in)1-5-420
【出力】:(equation.out)-2.00 2.00 5.00
#include <stdio.h>
#include <stdlib.h>

double a, b, c, d;
double fun(double x)
{
    return a * x * x * x + b * x * x + c * x + d;
}
double my_abs(double x)
{
    if (x < 0)
        return -x;
    return x;
}
int main()
{
    FILE *in,*out;
    in = fopen("equation.in","rt");
    out = fopen("equation.out","wt"); 
    double i;
    fscanf(in, "%lf%lf%lf%lf", &a, &b, &c, &d);
    for (i = -100; i < 0.0; i += 0.001)
        if (my_abs(fun(i)) < 0.00001)
                fprintf(out, "%.2lf ", i);
    int flag = 0;
    for (i = 0; i <= 100; i += 0.001)
        if (my_abs(fun(i)) < 0.00001) {
                if (flag == 0) {
                                flag = 1;
                                fprintf(out, "%.2lf ", i); 
                } else fprintf(out, "%.2lf
", i); } system("pause"); fclose(in); fclose(out); return 0; } /* 1 -5 -4 20 */