m0_74948836 2024-03-14 16:41 采纳率: 45.5%
浏览 4

关于#java#的问题:请问该代码应该如何修改

请问该代码应该如何修改?题目和代码分别如下P1024 [NOIP2001 提高组] 一元三次方程求解

img



import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
    public static int f(int x,int a,int b,int c,int d){
        int result=a*x*x*x+b*x*x+c*x+d;
        return result;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        int c=sc.nextInt();
        int d=sc.nextInt();
        int left = -100;
        int right = 100;

        while (left <= right) {
            int mid = ((right-left) / 2)+left;
            if (f(left,a,b,c,d) * f(mid,a,b,c,d) > 0) {
                left = mid+1;

            }
            if (f(left,a,b,c,d) * f(mid,a,b,c,d) < 0) {
                right = mid-1;
            }
            if(f(left,a,b,c,d) * f(mid,a,b,c,d) == 0){
                DecimalFormat decimalFormat = new DecimalFormat("#0.00"); // 设置保留两位小数的格式
                String formattedNumber = decimalFormat.format(mid);
                System.out.print(formattedNumber+" ");
            }
        }

    }
}


  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-14 16:42
    关注

    引自免费微信小程序:皆我百晓生

    这段代码需要修改,以解决以下问题:

    1. 一元三次方程的解可能为浮点数,但代码中将系数和变量都定义为了整数类型。首先,我们需要将输入和计算过程中的所有整数更改为 double 类型。

    2. f 函数应使用 double 而不是 int 来处理浮点数运算。

    3. 当找到一个根时,需要在找到下一个根之前更新左右边界。这里可以采用双指针方法(即二分搜索)来寻找三个不同实根,并确保满足题目要求的根与根之间的差值大于等于1。

    4. 输出结果应按照题目要求输出三个根,每个根保留两位小数。

    根据以上修改,以下是修改后的完整代码:

    import java.text.DecimalFormat;
    import java.util.Scanner;
    
    public class Main {
        public static double f(double x, double a, double b, double c, double d) {
            return a * Math.pow(x, 3) + b * Math.pow(x, 2) + c * x + d;
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            double a = sc.nextDouble();
            double b = sc.nextDouble();
            double c = sc.nextDouble();
            double d = sc.nextDouble();
            
            DecimalFormat decimalFormat = new DecimalFormat("#0.00");
    
            // 初始化左右边界
            double left = -100.0;
            double right = 100.0;
            double root1 = Double.NaN, root2 = Double.NaN, root3 = Double.NaN;
    
            // 查找第一个根
            while (left <= right) {
                double mid = (right + left) / 2;
                if (Math.abs(f(mid, a, b, c, d)) < 1e-6) { // 判断是否近似为0
                    root1 = mid;
                    break;
                } else if (f(left, a, b, c, d) * f(mid, a, b, c, d) > 0) {
                    left = mid + 1;
                } else {
                    right = mid;
                }
            }
    
            // 更新左右边界并查找第二个根
            left = Math.max(root1 - 1, -100.0);
            right = root1 + 1;
            while (left <= right) {
                double mid = (right + left) / 2;
                if (Math.abs(f(mid, a, b, c, d)) < 1e-6) {
                    root2 = mid;
                    break;
                } else if (f(root1, a, b, c, d) * f(mid, a, b, c, d) > 0) {
                    left = mid + 1;
                } else {
                    right = mid;
                }
            }
    
            // 更新左右边界并查找第三个根
            left = Math.max(root2 - 1, -100.0);
            right = root2 + 1;
            while (left <= right) {
                double mid = (right + left) / 2;
                if (Math.abs(f(mid, a, b, c, d)) < 1e-6) {
                    root3 = mid;
                    break;
                } else if (f(root2, a, b, c, d) * f(mid, a, b, c, d) > 0) {
                    left = mid + 1;
                } else {
                    right = mid;
                }
            }
    
            // 按顺序输出三个根
            System.out.println(decimalFormat.format(root1) + " " + decimalFormat.format(root2) + " " + decimalFormat.format(root3));
        }
    }
    

    注意:此代码并未考虑所有边界情况和特殊情况(例如,系数全为0的情况),请根据实际需求进一步完善。同时,对于复杂的方程求解,直接应用二分搜索可能存在精度损失和性能问题,实际工程中可能会结合牛顿迭代法或其他数值方法进行优化。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月14日