如何计算算术表达式(String)并返回答案?

时间:2013-04-25 11:48:56

标签: java string

我知道如何在没有变量的情况下计算简单表达式。但怎么办,在排队时我们用“x”表达? 例如

(x+1)*(x-1)

在此示例中,程序应返回:x ^ 2 - 1

4 个答案:

答案 0 :(得分:4)

这是一项非平凡的努力。我强烈建议你看看那里有什么。例如Symja

答案 1 :(得分:0)

您可能希望查看java的脚本功能。您似乎可以使用此脚本引擎从Java执行Javascript(或其他脚本语言)。

您可以在https://today.java.net/pub/a/today/2006/04/11/scripting-for-java-platform.html找到一些示例。

答案 2 :(得分:0)

您要求的是让程序转换(并可能解决)数学方程式。这当然是可能的,并且有工具和肯定的API可以做到这一点,但它绝对超出了你自己的java程序。

如果您只想计算给定公式的结果,那么这是可行的。有趣的是,你可以在Google上抛出一个等式(例如(5 + 3)*(8-4)),它会给你结果。那么,为什么不使用呢? ; - )

答案 3 :(得分:-1)

当我们去面试时,他们会问这个逻辑类型的问题。我遇到了同样的问题。但由于这类问题我无法成功接受采访。后来我在互联网上搜索后发现了自己的结果。所有想要这样做的朋友..

按照此操作。我会免费提供这个。

我将输入方程式字符串Like。

A * B * C + d / M-X。

将此等式作为字符串对象。并使用以下功能。#

public void calc() throws IOException
{
    String equation,store,get;

    StringBuilder sb= new StringBuilder();
    DataInputStream dis= new DataInputStream(System.in);
    System.out.println("Enter the equation");
    equation= dis.readLine();
    equation="%"+equation+"%";
    byte[] buf= equation.getBytes();
    for(int i=0;i<equation.length();i++)
    {
        if(buf[i]>=97&&buf[i]<=122)
        {
            System.out.println("Enter the value for "+(char)buf[i]);
            get=dis.readLine();
            sb.append(get);
        }
        else
            sb.append((char)buf[i]);
    }
    store= sb.toString();

    char[] buf1= new char[25];

    for(int i=0;i<store.length();i++)
    {
        buf1[i]=store.charAt(i);          
    }
    for(int i=0;i<buf1.length;i++)
    {
        no.append(buf1[i]);
    }
    System.out.println(no.toString());
    int m,n=0;
    for(int i=0;i<no.length()-1;i++)
    {
        if('/'==no.charAt(i))
        {
            leftCount=rightCount=0;
            m=findLeftValue(i-1) / findRightValue(i+1);
            no.replace(i-leftCount, i+rightCount+1, String.valueOf(m));
            i=0;  
        }          
   }


    for(int i=0;i<no.length()-1;i++)
    {
        if('*'==no.charAt(i))
        {
            leftCount=rightCount=0;
            m=findLeftValue(i-1) * findRightValue(i+1);
            no.replace(i-leftCount, i+rightCount+1, String.valueOf(m));
            i=0;  
        }          
   }
    for(int i=0;i<no.length()-1;i++)
    {
        if('+'==no.charAt(i))
        {
            leftCount=rightCount=0;
            m=findLeftValue(i-1) + findRightValue(i+1);
            no.replace(i-leftCount, i+rightCount+1, String.valueOf(m));
            i=0;  
        }          
   } 
     for(int i=0;i<no.length()-1;i++)
    {
        if('-'==no.charAt(i))
        {
            leftCount=rightCount=0;
            m=findLeftValue(i-1) - findRightValue(i+1);
            no.replace(i-leftCount, i+rightCount+1, String.valueOf(m));
            i=0;                 
        }          
   }
    for(int i=0;i<no.length();i++)
    {
        if('%'==no.charAt(i))
        {
            no.deleteCharAt(i);
            i=0;
        }
    }
    System.out.println(no.toString());



}
public int findLeftValue(int i)
{
    StringBuilder sb= new StringBuilder();
    int x=0;
    while(no.charAt(i)!='*'&&no.charAt(i)!='+'&&no.charAt(i)!='-'&&no.charAt(i)!='/' &&no.charAt(i)!='%')
    {
          leftCount++;
          sb.insert(0, no.charAt(i));
          i--;
    }          
     x=Integer.parseInt(sb.toString());
    return x;
}
 public int findRightValue(int i)
{
    StringBuilder sb= new StringBuilder();
    int x;            
    while(no.charAt(i)!='*'&&no.charAt(i)!='+'&&no.charAt(i)!='-'&&no.charAt(i)!='/' &&no.charAt(i)!='%')
    {        
        rightCount++;
        sb.append(no.charAt(i));            
        i++;
    }     
    x=Integer.parseInt(sb.toString());
    return x;
}          

这里可能是未使用的变量可能在那里。请找到并删除它。  我没有为计算设置任何偏好。只是我弥补了流程。如果你改变流程,答案会有所不同。所以,请记住。你也可以为不同的运营商做同样的事情。  还有一件事是,请在继续执行功能之前验证方程式。因为,它不会检查方程式是正确还是错误。(a + * d ++ c)。这是不正确的等式。 等式应该是正确的格式..就像a + b * c-d / x。

享受..打破面试,找到正确的工作..