Java如何从指定格式字符串中提取正负整数以适配方程求解需求
实现方案
核心思路
针对你需要的两种字符串解析场景,都可以通过正则表达式匹配实现整数提取,其中二次方程场景额外增加指数校验逻辑即可。
一、二次方程场景适配(直接替换你的现有代码)
实现逻辑说明
- 先统一替换输入中的上标
²为^2,降低匹配复杂度 - 校验所有
x^后的指数值,只要存在非2的指数直接终止程序 - 处理特殊系数场景:比如
x²等价于1x²、-x等价于-1x,避免匹配遗漏 - 提取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
相关产品推荐
相关产品推荐

