据说这是华为2005年中央平台开发部的JAVA比武大赛中的必做题,当时难倒了不少人。你能够给出最佳答案吗?把你的代码帖出来,看看谁的算法最简单最高效。
要求://///////////////////input.txt样例////////////////////////////////
1+3/7*2=
4+2/*asjdff*/5-8=
5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=
……………………………………… //更多表达式省略
//////////////////////////////////////////////////////////////////////////////////////output.txt样例////////////////////////////////
1+3/7*2=43
4+2/*asjdff*/*5-8=6
5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=??
……………………………………… //更多表达式省略
///////////////////////////////////////////////////////////// 1. 要求用JAVA实现。 2. 若在命令行参数中指明了 input.txt 和 output.txt,请计算出input.txt中每一行表达式的值,并写入到output.txt文件中 3. 若在命令行参数中只指明了 input.txt,则新建一个output.txt,计算出input.txt中每一行表达式的值,并写入到output.txt文件中 4. 若在命令行参数中没有指明 input.txt 和 output.txt,则输入一个类似4+2/*asjdff*/*5-8这样的表达式,计算1000次这个表达式的值,在屏幕中输出结计算结果和所用时间。 5. 要求最多在180分钟内完成。
221 次点击 发帖时间:2006-8-17 14:47:56
guaxixi627 前不久经过一个朋友提点做过类似的题目大体要求是如下的:step1:从键盘输入一个数学表达式到从文件中step2:从文件中读出并显示在屏幕上step3:计算表达式的结果,其实最难解决的应该是计算这步,给点思路,大家可以想想这步骤应该要用到 :逆波兰式(相信大家都知道这个东东),堆栈,的概念逆波兰式的好处就是把表达式变换一下以便使用堆栈来处理如:1+(2*(4—2))%5则逆波兰式为:1 2 4 2 — * 5 % + (这样可以去除掉括号 ~~~(:)然后利用堆栈的技术 做下一步的计算看过数据结构的应该都知道上面求逆波兰式的算法,我就不多讲了。大家可以思考下。呵呵! 大体步骤如下:1.读取文件中的表达式到一个容器
2.将表达式转化为逆波兰式
3.用堆栈的方法处理表达式
4.打印或保存结果
我也只是个新手,看大家怎么做
要求://///////////////////input.txt样例////////////////////////////////
1+3/7*2=
4+2/*asjdff*/5-8=
5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=
……………………………………… //更多表达式省略
//////////////////////////////////////////////////////////////////////////////////////output.txt样例////////////////////////////////
1+3/7*2=43
4+2/*asjdff*/*5-8=6
5%2+5-2/*4=6/*i**ifdg***/*84o*/*1-2=??
……………………………………… //更多表达式省略
///////////////////////////////////////////////////////////// 1. 要求用JAVA实现。 2. 若在命令行参数中指明了 input.txt 和 output.txt,请计算出input.txt中每一行表达式的值,并写入到output.txt文件中 3. 若在命令行参数中只指明了 input.txt,则新建一个output.txt,计算出input.txt中每一行表达式的值,并写入到output.txt文件中 4. 若在命令行参数中没有指明 input.txt 和 output.txt,则输入一个类似4+2/*asjdff*/*5-8这样的表达式,计算1000次这个表达式的值,在屏幕中输出结计算结果和所用时间。 5. 要求最多在180分钟内完成。
221 次点击 发帖时间:2006-8-17 14:47:56
guaxixi627 前不久经过一个朋友提点做过类似的题目大体要求是如下的:step1:从键盘输入一个数学表达式到从文件中step2:从文件中读出并显示在屏幕上step3:计算表达式的结果,其实最难解决的应该是计算这步,给点思路,大家可以想想这步骤应该要用到 :逆波兰式(相信大家都知道这个东东),堆栈,的概念逆波兰式的好处就是把表达式变换一下以便使用堆栈来处理如:1+(2*(4—2))%5则逆波兰式为:1 2 4 2 — * 5 % + (这样可以去除掉括号 ~~~(:)然后利用堆栈的技术 做下一步的计算看过数据结构的应该都知道上面求逆波兰式的算法,我就不多讲了。大家可以思考下。呵呵! 大体步骤如下:1.读取文件中的表达式到一个容器
2.将表达式转化为逆波兰式
3.用堆栈的方法处理表达式
4.打印或保存结果
我也只是个新手,看大家怎么做
动态创建一个方法,代码是 return xxxx;
再调用一下就可以了
import java.lang.reflect.Method;import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Loader;
import javassist.NotFoundException;/**
* @author treeroot
*
*/
public class SystemEx {
private SystemEx() {
} public static int evalInt(String codes) {
return ((Integer) eval(codes, "int")).intValue();
} public static double evalDouble(String codes) {
return ((Double) eval(codes, "double")).doubleValue();
} public static String evalString(String codes) {
return (String) evalObject(codes);
} public static Object evalObject(String codes) {
return eval(codes, "Object");
} public static Object eval(String codes, String retType) {
try {
ClassPool cp = ClassPool.getDefault();
CtClass cc;
String cls="SystemEx$Eval";
try{
cc=cp.get(cls);
}
catch(NotFoundException e){
cc= cp.makeClass(cls);
}
cc.defrost();
try{
CtMethod t=cc.getDeclaredMethod("invoke");
t.setBody("{"+ codes+ "}");
}
catch(NotFoundException e){
CtMethod cm = CtNewMethod.make("public "+ retType +" invoke(){"
+ codes + "}", cc);
cc.addMethod(cm);
}
Loader l=new Loader(cp);
Class c=l.loadClass(cls);
Method m = c.getMethod("invoke", null);
return m.invoke(c.newInstance(), null);
} catch (Exception e) {
throw new RuntimeException(e);
}
} public static void main(String[] args) {
String s="1+2+3+4+5+6+7+8+9+10";
int a = SystemEx.evalInt("return "+s+";");
int b=SystemEx.evalInt("return "+"453*434+2453"+";");
int c=SystemEx.evalInt("return "+"453*/*hello**/434+2453"+";");
System.out.println(a);
System.out.println(b);
System.out.println(c);
}}