一个编程问题! 我想设计一个程序,就是让你输入一个四位数,然后把这个四位数分成至少二分,用加减乘除连接,使得输出的值最大:比如1234,那么最大的输出值就是321*4=1284,又如1000,最大值为100+0=0.我想了一个晚上都没有想通,所以请大家来帮帮了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.io.*;import java.util.*;public class Main{ public static double max=Double.MIN_VALUE; public static String rs=""; public static void main(String [] args) { int n=1000; String s=String.valueOf(n); f(s,1,0); System.out.println(rs+"="+max); } private static void f(String s,int d,int fen) { if(d==4) { if(fen<1) return; s=s.replaceAll(" +",""); //System.out.println(s); double dt; try { dt=JiSuan.jisuan(s); } catch(Exception e) { return; } if(dt>=max) { max=dt; rs=s; } return; } String t=""; t=s.substring(0,d*2-1)+"+"+s.substring(d*2-1); f(t,d+1,fen+1); t=s.substring(0,d*2-1)+"-"+s.substring(d*2-1); f(t,d+1,fen+1); t=s.substring(0,d*2-1)+"*"+s.substring(d*2-1); f(t,d+1,fen+1); t=s.substring(0,d*2-1)+"/"+s.substring(d*2-1); f(t,d+1,fen+1); t=s.substring(0,d*2-1)+" "+s.substring(d*2-1); f(t,d+1,fen); } }class JiSuan{ private static int index=-1; public static double jisuan(String s) throws IOException { LinkedList<Token>oper=new LinkedList<Token>(); oper.addFirst(new Token('#',-1)); LinkedList<Double>num=new LinkedList<Double>(); String t=""; for(int i=0;i<s.length();i++) { if(s.charAt(i)=='(') { if(t.equals("")!=true) { num.addFirst(new Double(t)); t=""; } oper.addFirst(new Token('(',0)); } if(s.charAt(i)==')') { if(t.equals("")!=true) { num.addFirst(new Double(t)); t=""; } while(true) { Token cur=oper.removeFirst(); if(cur.c=='(')break; double d2=num.removeFirst(); double d1=num.removeFirst(); if(cur.c=='+') num.addFirst(d1+d2); if(cur.c=='-') num.addFirst(d1-d2); if(cur.c=='*') num.addFirst(d1*d2); if(cur.c=='/') { if(d2==0) { throw new IOException(); } num.addFirst(d1/d2); } } } if(s.charAt(i)=='+') { if(t.equals("")!=true) { num.addFirst(new Double(t)); t=""; } Token tnew=new Token('+',1); while(true) { Token cur=oper.removeFirst(); if(tnew.level>cur.level) { oper.addFirst(cur); oper.addFirst(tnew); break; } else { double d2=num.removeFirst(); double d1=num.removeFirst(); if(cur.c=='+') num.addFirst(d1+d2); if(cur.c=='-') num.addFirst(d1-d2); if(cur.c=='*') num.addFirst(d1*d2); if(cur.c=='/') { if(d2==0) { throw new IOException(); } num.addFirst(d1/d2); } } } } if(s.charAt(i)=='-') { if(t.equals("")!=true) { num.addFirst(new Double(t)); t=""; } Token tnew=new Token('-',1); while(true) { Token cur=oper.removeFirst(); if(tnew.level>cur.level) { oper.addFirst(cur); oper.addFirst(tnew); break; } else { double d2=num.removeFirst(); double d1=num.removeFirst(); if(cur.c=='+') num.addFirst(d1+d2); if(cur.c=='-') num.addFirst(d1-d2); if(cur.c=='*') num.addFirst(d1*d2); if(cur.c=='/') { if(d2==0) { throw new IOException(); } num.addFirst(d1/d2); } } } } if(s.charAt(i)=='*') { if(t.equals("")!=true) { num.addFirst(new Double(t)); t=""; } Token tnew=new Token('*',2); while(true) { Token cur=oper.removeFirst(); if(tnew.level>cur.level) { oper.addFirst(cur); oper.addFirst(tnew); break; } else { double d2=num.removeFirst(); double d1=num.removeFirst(); if(cur.c=='+') num.addFirst(d1+d2); if(cur.c=='-') num.addFirst(d1-d2); if(cur.c=='*') num.addFirst(d1*d2); if(cur.c=='/') { if(d2==0) { throw new IOException(); } num.addFirst(d1/d2); } } } } if(s.charAt(i)=='/') { if(t.equals("")!=true) { num.addFirst(new Double(t)); t=""; } Token tnew=new Token('/',2); while(true) { Token cur=oper.removeFirst(); if(tnew.level>cur.level) { oper.addFirst(cur); oper.addFirst(tnew); break; } else { double d2=num.removeFirst(); double d1=num.removeFirst(); if(cur.c=='+') num.addFirst(d1+d2); if(cur.c=='-') num.addFirst(d1-d2); if(cur.c=='*') num.addFirst(d1*d2); if(cur.c=='/') { if(d2==0) { throw new IOException(); } num.addFirst(d1/d2); } } } } if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.') t+=s.charAt(i); } if(t.equals("")!=true) num.addFirst(new Double(t)); while(oper.size()>1) { Token cur=oper.removeFirst(); double d2=num.removeFirst(); double d1=num.removeFirst(); if(cur.c=='+') { num.addFirst(d1+d2); } if(cur.c=='-') num.addFirst(d1-d2); if(cur.c=='*') num.addFirst(d1*d2); if(cur.c=='/') { if(d2==0) { throw new IOException(); } num.addFirst(d1/d2); } } return num.getFirst(); } }class Token{ public char c; public int level;//运算优先级 :(:0 +:1 -:1 *:2 /:2 ):3 public Token(char c,int level) { this.c=c; this.level=level; } public String toString() { return ""+c+" "+level; }} TO: yangbc(土豆块)哈哈,没有下多少本钱,原来写过一个计算四则表达式的类,这里直接利用了 TO: faen(发恩) 先生真乃神人也. ULR编码问题 随机置换问题如何处理?求思路。。。 按钮监听难题 关于JBuilder Design生成代码的疑问 小弟不才,想向各位请教线程中sleep()方法 怎样可以使JFrame的最大化按钮失效? 初学者请看。。。。。。 初学者的问题大家帮忙呀!!谢谢了 下面的程序如何不能编译? 高手请帮忙,100分! 关于.java文件的存放?如何安排? 得到路径后,怎么在路径后面+"\"?
import java.util.*;
public class Main
{
public static double max=Double.MIN_VALUE;
public static String rs="";
public static void main(String [] args)
{
int n=1000;
String s=String.valueOf(n);
f(s,1,0);
System.out.println(rs+"="+max);
}
private static void f(String s,int d,int fen)
{
if(d==4)
{
if(fen<1)
return;
s=s.replaceAll(" +","");
//System.out.println(s);
double dt;
try
{
dt=JiSuan.jisuan(s);
}
catch(Exception e)
{
return;
}
if(dt>=max)
{
max=dt;
rs=s;
}
return;
}
String t="";
t=s.substring(0,d*2-1)+"+"+s.substring(d*2-1);
f(t,d+1,fen+1);
t=s.substring(0,d*2-1)+"-"+s.substring(d*2-1);
f(t,d+1,fen+1);
t=s.substring(0,d*2-1)+"*"+s.substring(d*2-1);
f(t,d+1,fen+1);
t=s.substring(0,d*2-1)+"/"+s.substring(d*2-1);
f(t,d+1,fen+1);
t=s.substring(0,d*2-1)+" "+s.substring(d*2-1);
f(t,d+1,fen);
}
}class JiSuan
{
private static int index=-1;
public static double jisuan(String s) throws IOException
{
LinkedList<Token>oper=new LinkedList<Token>();
oper.addFirst(new Token('#',-1));
LinkedList<Double>num=new LinkedList<Double>();
String t="";
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)=='(')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
oper.addFirst(new Token('(',0));
}
if(s.charAt(i)==')')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
while(true)
{
Token cur=oper.removeFirst();
if(cur.c=='(')break;
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
throw new IOException();
}
num.addFirst(d1/d2);
}
}
}
if(s.charAt(i)=='+')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('+',1);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
throw new IOException();
}
num.addFirst(d1/d2);
}
}
}
}
if(s.charAt(i)=='-')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('-',1);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
throw new IOException();
}
num.addFirst(d1/d2);
}
}
}
}
if(s.charAt(i)=='*')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('*',2);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
throw new IOException();
}
num.addFirst(d1/d2);
}
}
}
}
if(s.charAt(i)=='/')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('/',2);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
throw new IOException();
}
num.addFirst(d1/d2);
}
}
}
}
if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.')
t+=s.charAt(i);
}
if(t.equals("")!=true)
num.addFirst(new Double(t));
while(oper.size()>1)
{
Token cur=oper.removeFirst();
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
{
num.addFirst(d1+d2);
}
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
throw new IOException();
}
num.addFirst(d1/d2);
}
}
return num.getFirst();
}
}
class Token
{
public char c;
public int level;//运算优先级 :(:0 +:1 -:1 *:2 /:2 ):3
public Token(char c,int level)
{
this.c=c;
this.level=level;
}
public String toString()
{
return ""+c+" "+level;
}
}
哈哈,没有下多少本钱,原来写过一个计算四则表达式的类,这里直接利用了
先生真乃神人也.