Java二项式展开程序:如何提取首项中的单个变量字符?
解决二项式展开程序中提取变量字符的问题
方法一:优化现有Scanner逻辑
你当前的Scanner处理思路其实是可行的——Scanner.nextLong()会自动读取输入中所有连续的数字(包含正负号),不受整数长度影响;Scanner.next()则会读取空格分隔后的变量部分,直接取第一个字符就是目标变量。只需调整变量类型并增加异常处理,就能解决问题:
import java.util.*; public class binomial_expansion { public static long factorial(long x) { long xf = x ; for(long i = 1; i<=x ; i++) { xf*=i ; } return xf ; } public static double C(long n, long r) { double c = factorial(n)/(factorial(n-r)*factorial(r)) ; return c ; } public static void main() { Scanner sc = new Scanner(System.in); boolean error = false; String a = ""; long coeff = 0; char var = ' '; do { if(error) { System.out.println("Error; Please try again"); error = false; } System.out.println("Enter a (separate single variable with space) : "); a = sc.nextLine().trim(); // 去除首尾空格 if(a.isEmpty()) { error = true; continue; } try (Scanner scan = new Scanner(a)) { coeff = scan.nextLong(); if(scan.hasNext()) { var = scan.next().charAt(0); } else { // 处理只输入数字未输入变量的情况 error = true; } } catch (InputMismatchException e) { // 捕获输入格式错误(比如非整数数字) error = true; } } while(error); sc.close(); // 测试输出 System.out.println("提取的系数:" + coeff + ",变量:" + var); } }
方法二:使用正则表达式(适配更多输入场景)
如果想支持更灵活的输入格式(比如允许数字和变量之间无空格,例如-5x或3y),可以用正则表达式直接匹配提取,无需额外创建Scanner实例:
import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class binomial_expansion { public static long factorial(long x) { long xf = x ; for(long i = 1; i<=x ; i++) { xf*=i ; } return xf ; } public static double C(long n, long r) { double c = factorial(n)/(factorial(n-r)*factorial(r)) ; return c ; } public static void main() { Scanner sc = new Scanner(System.in); boolean error = false; String a = ""; long coeff = 0; char var = ' '; // 正则表达式:匹配正负整数+单个字母变量,支持带空格或不带空格 String regex = "^([+-]?\\d+)\\s*([a-zA-Z])$"; do { if(error) { System.out.println("Error; Please try again"); error = false; } System.out.println("Enter a (e.g. 3 x or -5y) : "); a = sc.nextLine().trim(); Matcher matcher = Pattern.compile(regex).matcher(a); if(matcher.matches()) { coeff = Long.parseLong(matcher.group(1)); var = matcher.group(2).charAt(0); } else { error = true; } } while(error); sc.close(); // 测试输出 System.out.println("提取的系数:" + coeff + ",变量:" + var); } }
核心说明
- 方法一基于你原有的代码逻辑,仅修正了变量类型(原代码中
x1应定义为char而非long)并补充了异常处理,就能稳定提取变量,完全无需关心整数长度。 - 方法二通过正则表达式,同时支持带空格和无空格的输入格式,适配更多用户输入习惯,代码更简洁。
内容的提问来源于stack exchange,提问作者Super Coder
相关产品推荐
相关产品推荐

