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

时间:2019-03-30 15:05:18

标签: kotlin coefficients

在输入处,我得到一个作为字符串的多项式,例如“ 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
    }

1 个答案:

答案 0 :(得分:0)

这是一个实现。

这有点笼统,允许术语以任何顺序排列,并带有空白。但是它仍然假设多项式是有效的,幂是非负的并且全都不同,并且至少有一个项。

您没有指定系数的顺序,因此这将以递增的幂形式返回它们(从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 }
}

样本结果:

  • coeffs(“ x ^ 2 + 2x-1”)= [-1,2,1]
  • coeffs(“ 2x ^ 3-3x ^ 4-x + 4”)= [4,-1,0,2,-3]
  • coeffs(“ x”)= [0,1]
  • coeffs(“-2”)= [-2]

首先将字符串分割为多个词。 ((?=[+-])是一个超前行,如果后面跟+-则匹配一个空字符串.Java / Kotlin正则表达式的完整文档为here。)

然后将每个项分解为系数和幂,将它们转换为数字,然后将createsMap从项转换为系数。 (这很尴尬,因为它必须处理一些缺少数字和/或符号的特殊情况。)使用?

最后,它找到最大的幂,然后将映射图转换为幂数递增的系数列表,对于缺失的幂填充0。

我将代码简短说明了原理。如果要在生产中使用它,您可能应该使其更安全,更高效,例如通过检查无效输入,例如空字符串,无效字符或重复的权力;并将Regex放在属性中,这样就不必每次都重新创建它们。某些单元测试也不是一件坏事!