我写了一个代码在Kotlin为评估一个给定的字符串从除法到减法,它的工作,但它给出了错误的答案,例如,我得到了一个字符串x在第一行有答案-215.96666,而从代码的答案是-237.366666 idk的错误是。我看到更多的人使用堆栈这样做,但我想这样做的方式来评估字符串
var x : String = "5+4-10x20-40/30x20+34/20"
fun div(x: String): String {
val lis1 = x.split("-").toMutableList()
for (ele1 in lis1) {
if ("/" in ele1) {
val pos1 = lis1.indexOf(ele1)
val lis2 = ele1.split("+").toMutableList()
for (ele2 in lis2) {
if ("/" in ele2) {
val pos3 = lis2.indexOf(ele2)
val lis3 = ele2.split("x").toMutableList()
for (ele3 in lis3) {
if ("/" in ele3) {
val pos4 = lis3.indexOf(ele3)
val lis4 = ele3.split("/")
val div = (lis4[0].toDouble() / lis4[1].toDouble()).toString()
lis3[pos4] = div
}
}
lis2[pos3] = lis3.joinToString("x")
}
}
lis1[pos1] = lis2.joinToString("+")
}
}
return (lis1.joinToString("-"))
}
fun mul(x : String) : String{
val lis1 = x.split("-").toMutableList()
for (ele1 in lis1) {
if("x" in ele1){
val pos1 = lis1.indexOf(ele1)
val lis2 = ele1.split("+").toMutableList()
for(ele2 in lis2){
if("x" in ele2){
val pos2 = lis2.indexOf(ele2)
val lis3 = ele2.split("x")
val mul = (lis3[0].toDouble() * lis3[1].toDouble()).toString()
lis2[pos2] = mul
}
}
lis1[pos1] = lis2.joinToString("+")
}
}
return (lis1.joinToString("-"))
}
fun add(x : String): String {
val lis1 = x.split("-").toMutableList()
for(ele1 in lis1){
if("+" in ele1){
val pos1 = lis1.indexOf(ele1)
val lis2 = ele1.split("+")
val add = (lis2[0].toDouble() + lis2[1].toDouble()).toString()
lis1[pos1] = add
}
}
return (lis1.joinToString("-"))
}
fun sub(x : String) : String{
val lis1 = x.split("-").toMutableList()
var sub = 0.0
for(ele1 in lis1){
sub -= ele1.toDouble()
}
return (sub.toString())
}
fun eval(x: String): String {
val divanswer = div(x)
val mulanswer = mul(divanswer)
val addanswer = add(mulanswer)
return sub(addanswer)
}
fun main(args: Array<String>){
println(eval(x))
}
i wanted the answer as -215.96666 but the answer given by code is -237.366666
2条答案
按热度按时间o2g1uqev1#
在这个特定输入的情况下,涉及到两个bug。
第一个bug是关于你先处理
+
,然后处理-
,但是在数学上我们应该一起处理它们,从左到右,结果你的算法处理了:1-1+1
(正确答案:1
)作为:1-(1+1)
(答案:或者,我认为先处理-
,然后再处理+
应该可以正常工作。第二个错误是在
sub()
中,你从0
开始,甚至减去第一个数字,但是第一个数字实际上应该被加上或用作初始值。我相信在修复了这两个bug之后,它应该会为这个特定的输入提供一个正确的答案,但是类似的bug可能还有更多。例如,你错误地处理了同一个运算符的链,你只关心第一对,所以
1+1+1
变成了2
(然后由于前面提到的bug,它变成了-2
)。作为一般建议,学习使用调试器并分析代码处理数据时数据是如何变化的。即使只是打印中间结果:
divanswer
,mulanswer
和addanswer
,然后通过谷歌运行它们进行处理,你会注意到在add()
步骤的某个地方有问题。然后冲洗并重复,直到一切正常工作。bvn4nwqk2#
感谢@broot发现了这个问题,问题出在加法和减法部分,现在我把它们合并成一个,并得到了我输入的字符串的正确答案,下面是更正后的完整代码。