繁体   English   中英

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

[英]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 }
}

样品结果:

  • 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正则表达式的完整文档。)

然后,它将每个项分成系数和幂,将它们转换为数字,并创建从项到系数的Map (这很尴尬,因为它必须处理缺少数字和/或符号的几种特殊情况。)使用地图处理缺失的权力(以及不按顺序的权力)。

最后,它找到最大的功率,并将地图转换为增加功率的系数列表,为缺失的功率填充0。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM