You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何从指定格式字符串中提取正负整数以适配方程求解需求

实现方案

核心思路

针对你需要的两种字符串解析场景,都可以通过正则表达式匹配实现整数提取,其中二次方程场景额外增加指数校验逻辑即可。

一、二次方程场景适配(直接替换你的现有代码)

实现逻辑说明

  1. 先统一替换输入中的上标²为^2,降低匹配复杂度
  2. 校验所有x^后的指数值,只要存在非2的指数直接终止程序
  3. 处理特殊系数场景:比如x²等价于1x²、-x等价于-1x,避免匹配遗漏
  4. 提取a(x²项系数)、b(x项系数)、c(常数项)三个值代入求根公式
    注意:你原有代码的求根公式存在运算优先级错误,已经修正

完整代码

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class QuadraticSolver {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入二次方程:");
        String input = sc.nextLine().trim();
        sc.close();

        // 预处理:统一上标格式
        input = input.replaceAll("²", "^2");

        // 校验二次项指数是否都是2
        Pattern exponentPattern = Pattern.compile("x\\^(\\d+)");
        Matcher exponentMatcher = exponentPattern.matcher(input);
        while (exponentMatcher.find()) {
            int exp = Integer.parseInt(exponentMatcher.group(1));
            if (exp != 2) {
                System.out.println("仅支持二次方程,指数需为2,程序终止");
                return;
            }
        }

        // 补全系数为1/-1的省略写法
        input = input.replaceAll("(^|[-+])x", "$11x");

        // 匹配三个系数:a(x²系数)、b(x系数)、c(常数项)
        double a = 0, b = 0, c = 0;
        // 匹配x²项系数
        Pattern aPattern = Pattern.compile("([-+]?\\d+)x\\^2");
        Matcher aMatcher = aPattern.matcher(input);
        if (aMatcher.find()) {
            a = Double.parseDouble(aMatcher.group(1));
        }
        // 匹配x项系数
        Pattern bPattern = Pattern.compile("([-+]?\\d+)x(?!\\^)");
        Matcher bMatcher = bPattern.matcher(input);
        if (bMatcher.find()) {
            b = Double.parseDouble(bMatcher.group(1));
        }
        // 匹配常数项
        Pattern cPattern = Pattern.compile("([-+]?\\d+)(?=$)");
        Matcher cMatcher = cPattern.matcher(input);
        if (cMatcher.find()) {
            c = Double.parseDouble(cMatcher.group(1));
        }

        // 求根逻辑
        double discriminant = Math.pow(b, 2) - 4 * a * c;
        if (discriminant < 0) {
            System.out.println("方程无实根");
            return;
        }
        double firstRoot = (-b + Math.sqrt(discriminant)) / (2 * a);
        double secondRoot = (-b - Math.sqrt(discriminant)) / (2 * a);
        System.out.println("方程的根为:" + firstRoot + " 和 " + secondRoot);
    }
}

测试效果

输入4x²-8x+6或者4x^2-8x+6,都会自动提取a=4,b=-8,c=6完成计算。

二、二元一次等式场景整数提取

针对3x-8y=2这类格式,直接用正则匹配所有带符号的整数即可:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public static List<Integer> extractEquationInts(String input) {
    List<Integer> result = new ArrayList<>();
    // 补全系数省略写法,比如x=2转1x=2,-y+3=0转-1y+3=0
    input = input.replaceAll("(^|[-+=])x", "$11x");
    input = input.replaceAll("(^|[-+=])y", "$11y");
    Pattern pattern = Pattern.compile("[-+]?\\d+");
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        result.add(Integer.parseInt(matcher.group()));
    }
    return result;
}

输入3x-8y=2时,返回结果为[3, -8, 2],符合要求。

内容的提问来源于stack exchange,提问作者CodNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:24:02