用递归做的,测试样例过了,只有4和6是对的,请求支援

B2047 分段函数

KARA_214 @ 2023-08-07 15:47:01

#include <bits/stdc++.h>
using namespace std;
double f(double x){
    if(0<=x<5) return 0-x+2.5;
    if(5<=x<10) return 2-1.5*(x-3)*(x-3);
    if(10<=x<20) return x/2-1.5;
}
int main(){
    double y;
    cin>>y;
    cout<<fixed<<setprecision(3)<<f(y)<<endl;
    return 0;
}

by definieren @ 2023-08-07 15:54:52

建议把

    if(0<=x<5) return 0-x+2.5;
    if(5<=x<10) return 2-1.5*(x-3)*(x-3);
    if(10<=x<20) return x/2-1.5;

改为

    if(0<=x && x<5) return 0-x+2.5;
    if(5<=x && x<10) return 2-1.5*(x-3)*(x-3);
    if(10<=x && x<20) return x/2-1.5;

by 编码落寞 @ 2023-08-07 15:57:35

x/2-1.5 这里先x1.0。而且你这不算递归,只能算调用函数


by ZJYlove @ 2023-08-07 15:57:48

你这函数都用错了,哪有0<=x<5的,是0<=x&&x<5,5<=x&&x<10和10<=x&&x<20

#include <bits/stdc++.h>
using namespace std;
double f(double x){
    if(0<=x&&x<5) return 0-x+2.5;
    if(5<=x&&x<10) return 2-1.5*(x-3)*(x-3);
    if(10<=x&&x<20) return x/2-1.5;
}
int main(){
    double y;
    cin>>y;
    cout<<fixed<<setprecision(3)<<f(y)<<endl;
    return 0;
}

by Terrible @ 2023-08-07 15:57:51

@KARA_214

在 C/C++ 里,我们有一套二元运算符运算法则,其中 <= < >= > 是从左到右运算的,运算结果如果看成数的话是 真(1),假 (0),按照 0<=x<5 的计算方法是先计算 0<=x 返回一个 01 值,然后计算 0<51<5 所以结果一定是 1,所以一定在第一个if 就返回了。

0<=x<5这种语法在一些语言中是有理想实现的,例如 Python 会把这个式子解读成 “x 大于等于 0 且小于 5”。其他很多程序设计语言是当成两个不相干平行二元运算的。

应当写成 0<=x&&x<5

(函数递归一次也是递归吗?)


by Terrible @ 2023-08-07 15:58:45

0-x只需写成 -x 即可,C/C++ 中有一种运算符是正负运算符。


by KARA_214 @ 2023-08-08 09:55:23

谢谢各位,已AC,我会继续努力


|