如何从多项式表达式中获取系数?

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 放入属性中,这样就不必每次都重新创建它们。一些单元测试也不是坏事!