0

我知道如何计算没有变量的简单表达式。但是怎么办,当我们用“x”表达时呢?例如

(x+1)*(x-1)

在这个示例程序中应该返回:x^2 - 1

4

4 回答 4

4

这是一项不平凡的努力。我强烈建议你看看外面有什么。例如Symja

于 2013-04-25T11:55:26.020 回答
0

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

如果您只想计算给定公式的结果,那么这是可行的。有趣的是,您只需向 Google 抛出一个方程式(例如 (5 + 3) * (8-4)),它就会为您提供结果。那么,为什么不直接使用它呢?;-)

于 2013-04-25T12:02:20.450 回答
0

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

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

于 2013-04-25T12:00:13.670 回答
-1

当我们去面试时,他们会问这种合乎逻辑的问题。我遇到了同样的问题。但我无法成功面试,因为这类问题。后来我在网上搜索后找到了自己的结果。都想做这个的朋友。。

按照这个操作。我会给这个完全免费的。

我将输入等式作为字符串 Like。

a*b*c+d/mx。

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

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*cd/x。

享受..打破面试并获得正确的工作..

于 2014-07-26T09:10:45.173 回答