Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 格式化数学函数_Java - Fatal编程技术网

Java 格式化数学函数

Java 格式化数学函数,java,Java,我有一大堆数学函数是从一个程序以这种格式输出的: (704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200 我需要编

我有一大堆数学函数是从一个程序以这种格式输出的:

(704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200
我需要编写一个脚本,将它们转换为可读的格式,如下所示:

(704253724578.0182000000000000 * ( ((sqrt(X13-X11) / (X18/X15)) /((((X1*X20)/X19)^2) * X2))/ (((X1 * X20) * (X25 / X15)) / X9)) ) + 77.2424201451314200
关于在java中实现这一点的最佳方法是什么,有什么想法吗?除了java,还有其他更好的工具吗


谢谢

安装Ruby和一个名为“sexpistol”的漂亮gem,它允许您处理s表达式

我为您破解了一个解决方案:

require 'sexpistol'
require 'pp'

exp="(704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200"

parser = Sexpistol.new
tree= parser.parse_string(exp)

SYM={
    :".*" => :*,
    :*   => :*,
    :"+" => :"+",
    :- => :-,
    :mydivide => :/,
    :square => "^2",
    :mysqrt => "mysqrt"
    }

def isPrefix sexp
    return true if SYM[sexp.first]
    return false    
end

def p2i sexp
    if sexp.is_a? Array
        if isPrefix(sexp)
            op,lhs,rhs =sexp
            case op
            when :square
                return [p2i(lhs),SYM[op]]
            when :mysqrt
                return [:mysqrt,p2i(lhs)]
            else
                return [p2i(lhs),SYM[op],p2i(rhs)]
            end
        else
            lhs,op,rhs=sexp
            return [p2i(lhs),SYM[op],p2i(rhs)]
        end
    else
        return sexp
    end
end

pp parser.to_sexp(p2i(tree)).first
# prints : (704253724578.0182 * ((((mysqrt (X13 - X11)) / (X18 / X15)) / ((((X1 * X20) / X19) ^2) * X2)) / (((X1 * X20) * (X25 / X15)) / X9))) + 77.24242014513142

如果你写一篇论文,你可以承认我

这看起来像是一个术语代数到中缀表示法的问题,与语言无关。当使用幂/指数时,不要使用
^
字符,它不会做您认为它会做的事情。如果需要将
x
提升到
2
(例如
x^2
),则应使用
Math.pow(x,2)
^
操作符实际上是一个.right。。。我并不是在做数学题。我只是简单地尝试格式化字符串,使其从前缀表示法转换为中缀表示法。知道如何格式化字符串吗?谢谢这只是s表达式的递归遍历问题。然后对子表达式的格式应用wright变换。感谢所有的帮助!我用堆栈来推送和弹出java中的术语,也许你可以验证答案(有效的解决方案)。谢谢!