[英]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
}
这是一个实现。
它略微更为通用,允许术语以任何顺序排列,并具有周围的空白。 但它仍假设多项式是有效的,幂是非负的并且都是不同的,并且至少有一个项。
你没有指定系数的顺序,所以这会以增加的功率返回它们(从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 }
}
样品结果:
它首先将字符串拆分为术语。 ( (?=[+-])
是一个前瞻,如果后面跟着+
或-
则匹配一个空字符串。 这里有关于Java / Kotlin正则表达式的完整文档。)
然后,它将每个项分成系数和幂,将它们转换为数字,并创建从项到系数的Map
。 (这很尴尬,因为它必须处理缺少数字和/或符号的几种特殊情况。)使用地图处理缺失的权力(以及不按顺序的权力)。
最后,它找到最大的功率,并将地图转换为增加功率的系数列表,为缺失的功率填充0。
我保持代码简短,以显示原理。 如果要在生产中使用它,你可能应该使它更安全和更有效,例如通过检查无效输入,如空字符串,无效字符或重复的权力; 并将Regex
放在属性中,这样就不必每次都重新创建它们。 一些单元测试也不是坏事!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.