我想设计一个程序,就是让你输入一个四位数,然后把这个四位数分成至少二分,用加减乘除连接,使得输出的值最大:比如1234,那么最大的输出值就是321*4=1284,又如1000,最大值为100+0=0.我想了一个晚上都没有想通,所以请大家来帮帮了。

解决方案 »

  1.   

    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;
    }
    }
      

  2.   

    TO: yangbc(土豆块)
    哈哈,没有下多少本钱,原来写过一个计算四则表达式的类,这里直接利用了
      

  3.   

    TO: faen(发恩) 
    先生真乃神人也.