2, 4一直错
查看原帖
2, 4一直错
685875
Novel8533楼主2023/3/23 19:40
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;

int ab[215][3];
double ac[21555];
double a, b, c, d;

int IsBlue(double mid, int flag){
    double c = a * pow(mid, 3) + b * pow(mid, 2) + c * mid + d;
    if(flag == 1){
        if(c >= 0) return 1;
        else return 0;
    }
    else if(flag == 0){
        if(c <= 0) return 1;
        else return 0;
    }
    return 0;
}

int dw(int l, int r, int flag){
    if(flag == 1){
        while(l + 1 != r){
            int mid = (l + r) / 2;
            if(IsBlue(ac[mid], 1)){
                l = mid;
            }
            else r = mid;
        }
    }
    else if(flag == 0){
        while(l + 1 != r){
            int mid = (l + r) / 2;
            if(IsBlue(ac[mid], 0)){
                l = mid;
            }
            else r = mid;
        }
    }
    return l;
}

int main(){
    int j = 0;
    scanf("%lf %lf %lf %lf",&a, &b, &c, &d);
    for(int i = -100; i <= 100; i++){
        double q = a * pow(i, 3) + b * pow(i, 2) + c * i + d;
        double p = 0;
        if(i != 100){
            p = a * pow(i + 1, 3) + b * pow(i + 1, 2) + c * (i + 1) + d;
        }
        if(q == 0) printf("%d.00 ",i);
        else if(q > 0&& p < 0){
            ab[++j][1] = i;ab[j][2] = 1; ab[++j][1] = i + 1;
        }
        else if(q < 0&& p > 0){
            ab[++j][1] = i; ab[j][2] = 0; ab[++j][1] = i + 1;
        }
    }
    for(int i = 1; i <= j; i += 2){
        int q = 0;
        for(double k = ab[i][1]; k <= ab[i + 1][1]; k += 0.0001){
            ac[++q] = k;
        }
        int ans = dw(0, q + 1, ab[i][2]);
        printf("%.2f ",ac[ans]);
    }
    putchar('\n');
    return 0;
}

我是先找到函数值相乘小于0的两个根,然后用二分法保持精度在0.0001.

2023/3/23 19:40
加载中...