如何从多项式表达式中获取系数?
How can I get the coefficients from a polynomial expression?
在输入中我得到一个字符串形式的多项式,例如 "7x^4+3x^3-6x^2+x-8"。我想在变量中获取它的系数,但我不知道该怎么做。最大度数未知,系数为整数。也可以不存在某种程度的术语。如果有任何帮助,我将不胜感激。
我试着用“+”和“-”分开,然后用 "x^" 分开,但我在 x 上遇到了麻烦,这个词的(未写成的)度数为 1 .
我也尝试过先按 "x" 拆分,然后按“^”拆分,然后用“-”处理异常,但我不知道如何处理缺少度数的异常。
private fun koef(text: String) : List<Int> {
val vars = text.split("x")
val koefList = mutableListOf<Int>()
var count = 1
vars.forEach {
if (it == "-") koefList.add(-1)
else {
if (it[0] == '^')
}
}
return koefList
}
这是一种实现方式。
它稍微更通用一些,允许术语以任何顺序排列,并且周围有空格。但它仍然假设多项式有效,幂为非负且完全不同,并且至少有一项。
您没有指定系数的顺序,因此 returns 它们的幂次方递增(从 x^0 开始,然后是 x^1,&c)。
private fun coeffs(polynomial: String): List<Int> {
val terms = polynomial.split(Regex("(?=[+-])")).associate{ term ->
val s = term.split(Regex("x\^?"))
val coeff = s[0].replace(" ", "")
.let{ when (it){ "", "+" -> 1; "-" -> -1; else -> it.toInt() }}
val power = s.getOrNull(1)?.trim()
.let{ when (it){ null -> 0; "" -> 1; else -> it.toInt() }}
power to coeff
}
val highestPower = terms.keys.max()!!
return (0..highestPower).map{ terms[it] ?: 0 }
}
示例结果:
- 系数("x^2+2x-1") = [-1, 2, 1]
- coeffs("2x^3 - 3x^4 - x + 4") = [4, -1, 0, 2, -3]
- 系数("x") = [0, 1]
- 系数("-2") = [-2]
它首先将字符串拆分为术语。 ((?=[+-])
是先行,如果空字符串后跟 +
或 -
,则匹配空字符串。有关 Java/Kotlin 正则表达式的完整文档是 here。)
然后它将每个项拆分为系数和幂,将它们转换为数字,creates Map
从项到系数。 (这很尴尬,因为它必须处理数字 and/or 符号缺失的几种特殊情况。)使用地图处理缺失的权力(以及不按顺序的权力)。
最后,它找到最大的幂,并将映射转换为递增幂的系数列表,缺失的幂填0。
为了说明原理,我保持代码简短。如果要在生产中使用它,您应该让它更安全、更高效,例如通过检查无效输入,例如空字符串、无效字符或重复的权力;并将 Regex
放入属性中,这样就不必每次都重新创建它们。一些单元测试也不是坏事!
在输入中我得到一个字符串形式的多项式,例如 "7x^4+3x^3-6x^2+x-8"。我想在变量中获取它的系数,但我不知道该怎么做。最大度数未知,系数为整数。也可以不存在某种程度的术语。如果有任何帮助,我将不胜感激。
我试着用“+”和“-”分开,然后用 "x^" 分开,但我在 x 上遇到了麻烦,这个词的(未写成的)度数为 1 . 我也尝试过先按 "x" 拆分,然后按“^”拆分,然后用“-”处理异常,但我不知道如何处理缺少度数的异常。
private fun koef(text: String) : List<Int> {
val vars = text.split("x")
val koefList = mutableListOf<Int>()
var count = 1
vars.forEach {
if (it == "-") koefList.add(-1)
else {
if (it[0] == '^')
}
}
return koefList
}
这是一种实现方式。
它稍微更通用一些,允许术语以任何顺序排列,并且周围有空格。但它仍然假设多项式有效,幂为非负且完全不同,并且至少有一项。
您没有指定系数的顺序,因此 returns 它们的幂次方递增(从 x^0 开始,然后是 x^1,&c)。
private fun coeffs(polynomial: String): List<Int> {
val terms = polynomial.split(Regex("(?=[+-])")).associate{ term ->
val s = term.split(Regex("x\^?"))
val coeff = s[0].replace(" ", "")
.let{ when (it){ "", "+" -> 1; "-" -> -1; else -> it.toInt() }}
val power = s.getOrNull(1)?.trim()
.let{ when (it){ null -> 0; "" -> 1; else -> it.toInt() }}
power to coeff
}
val highestPower = terms.keys.max()!!
return (0..highestPower).map{ terms[it] ?: 0 }
}
示例结果:
- 系数("x^2+2x-1") = [-1, 2, 1]
- coeffs("2x^3 - 3x^4 - x + 4") = [4, -1, 0, 2, -3]
- 系数("x") = [0, 1]
- 系数("-2") = [-2]
它首先将字符串拆分为术语。 ((?=[+-])
是先行,如果空字符串后跟 +
或 -
,则匹配空字符串。有关 Java/Kotlin 正则表达式的完整文档是 here。)
然后它将每个项拆分为系数和幂,将它们转换为数字,creates Map
从项到系数。 (这很尴尬,因为它必须处理数字 and/or 符号缺失的几种特殊情况。)使用地图处理缺失的权力(以及不按顺序的权力)。
最后,它找到最大的幂,并将映射转换为递增幂的系数列表,缺失的幂填0。
为了说明原理,我保持代码简短。如果要在生产中使用它,您应该让它更安全、更高效,例如通过检查无效输入,例如空字符串、无效字符或重复的权力;并将 Regex
放入属性中,这样就不必每次都重新创建它们。一些单元测试也不是坏事!