请问用一个String变量接受一个算式,然后有什么方法能计算这个算式的结果吗?
比如:用一个String型变量接受了一个算式--2+3*4,怎么求其值啊? 最近在写个输入四个数字计算24点的小程序,想用三个4次的循环来代替四个数字中间的三个运算符,如:for( int i=1; i<=4; i++ ), 当等于1时,运算符为+,当i=2时,运算符为-,然后用string类型的变量接收类似“2+3*4”的算式,再求其值是否等于24,Integer.parseInt不行,因为“2+3*4”是一个字符串......
目前得到两种提示:一种是在java中使用JAVASCRIPT,另一种是貌似很难,将原字符串转换成后缀表达式,再以二叉树的形式保存!最后就开始计算结果,本人系初学者,以上两种方法涉及到的知识都没学到...
所以有三个问题请教大家:
1、大家认为我得到的两种提示,那一种方法实现起来相对容易一点,简单一点,适合初学者使用
2、关于这个“后缀表达式”,我粗略的看了一下,像“2+3*4”这样的算式貌似转换成后缀表达式之后是从左到右计算的,即(2+3)*4,而不是先计算3*4,在计算2+12,是这样的吗?
3、关于这个计算24点的小程序,大家有什么好的实现方法吗?
比如:用一个String型变量接受了一个算式--2+3*4,怎么求其值啊? 最近在写个输入四个数字计算24点的小程序,想用三个4次的循环来代替四个数字中间的三个运算符,如:for( int i=1; i<=4; i++ ), 当等于1时,运算符为+,当i=2时,运算符为-,然后用string类型的变量接收类似“2+3*4”的算式,再求其值是否等于24,Integer.parseInt不行,因为“2+3*4”是一个字符串......
目前得到两种提示:一种是在java中使用JAVASCRIPT,另一种是貌似很难,将原字符串转换成后缀表达式,再以二叉树的形式保存!最后就开始计算结果,本人系初学者,以上两种方法涉及到的知识都没学到...
所以有三个问题请教大家:
1、大家认为我得到的两种提示,那一种方法实现起来相对容易一点,简单一点,适合初学者使用
2、关于这个“后缀表达式”,我粗略的看了一下,像“2+3*4”这样的算式貌似转换成后缀表达式之后是从左到右计算的,即(2+3)*4,而不是先计算3*4,在计算2+12,是这样的吗?
3、关于这个计算24点的小程序,大家有什么好的实现方法吗?
下面是自己写的算24点的小程序,经测试,发现得出的答案不全
//算4个数 通过加减乘除 结果为24 列举每种情况统计... 得用double型的变量存储数据import javax.swing.*;
public class Test24
{
public static void main( String args[] )
{
int count = 0;
String out = "";
double num1 = 1;
double num2 = 1;
double num3 = 1;
double num4 = 1; try
{
num1 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the first integer!" ) );
num2 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the second integer!" ) );
num3 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the third integer!" ) );
num4 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the fourth integer!" ) );
} catch ( NumberFormatException numberFormatException ) {
JOptionPane.showMessageDialog( null, "You must enter an integer", "Invalid Number Format", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
for ( int i=1; i<=4; i++ )
{
double tmp1 = jiSuan( i, num1, num2 );
for ( int j=1; j<=4; j++ )
{
double tmp2 = jiSuan( j, tmp1, num3 );
for ( int k=1; k<=4; k++ )
{
double tmp3 = jiSuan( k, tmp2, num4 );
if ( tmp3 == 24 )
{ count++;
out += "第" + count + "个解法:((" + ( int )num1 + getSign( i ) + ( int )num2 + ")" + getSign( j ) + ( int )num3 + ")" + getSign( k ) + ( int )num4 + "= 24\n";
}
}
}
}
String outPut = "";
if ( count == 0 )
{
outPut += "对不起," + ( int )num1 + " " + ( int )num2 + " " + ( int )num3 + " " + ( int )num4 + " 算24点无解......";
}
else
{
outPut += "总共" + count +"种解法,它们是:\n" + out;
} JOptionPane.showMessageDialog( null, outPut, "Result", JOptionPane.PLAIN_MESSAGE );
System.exit( 0 );
} public static double jiSuan( int a, double b, double c )
{
double number = 0;
switch ( a )
{
case 1:
number = b + c;
break; case 2:
number = b - c;
break; case 3:
number = b * c;
break; case 4:
number = b / c;
break;
}
return number;
} public static String getSign( int a )
{
String sign = "";
switch ( a )
{
case 1:
sign = "+";
break; case 2:
sign = "-";
break; case 3:
sign = "×";
break; case 4:
sign = "÷";
break;
}
return sign;
}
}
http://www.javaread.com/topic/show/18网站:
http://jeval.sourceforge.net/