• BNU OJ 33691 / LA 4817 Calculator JAVA大数


    留着当个模板用,在BNU上AC,在LA上RE……可能是java的提交方式不同???

    数和运算符各开一个栈。

    表达式从左到右扫一遍,将数存成大数,遇到数压在 数的栈,运算符压在 运算符的栈,每当遇到右括号时,弹出 数的栈 的栈顶头两个元素,弹出 运算符的栈 顶的头一个元素,进行运算,将运算结果压回 数的栈 中。最后输出栈顶元素。

    运算过程中把不符合情况的判掉。

    我写的第二个java的题,竟然1A……这世界太不可思议了= =

    import java.util.*;
    import java.math.BigInteger;
    
    public class Main {
    
        static Scanner in=new Scanner(System.in);
        static int MAXN = 200010;
        static char[] ss = new char[MAXN];
        static char[] oper = new char[100];
        static BigInteger[] shu = new BigInteger[100];
        static BigInteger TEN = BigInteger.valueOf(10);
        static BigInteger ZERO = BigInteger.valueOf(0);
        static BigInteger MAXX = new BigInteger("999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");
        
        public static String init()
        {
            int i, j, top, len;
            if ( in.hasNext() == false ) return new String("End");
            
            String str = new String();
            String tmp = new String();
            
            top = 0;
            do
            {
                tmp = in.next();
                len = tmp.length();
                ss = tmp.toCharArray();
                
                for ( i = 0; i < len; ++i )
                {
                    if ( ss[i] == '(' ) ++top;
                    if ( ss[i] == ')' ) --top;
                }
                str = str + tmp;
            }while ( top != 0 );
            
            return str;
        }
        
        public static boolean GetOper( char a )
        {
            switch(a)
            {
            case '+': 
            case '-': 
            case '*': 
            case '/': return true;
            default: return false;
            }
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String Prob;
            boolean flag, GetOp;
            int len, i, j, top ;
            int topOp, topShu;
            BigInteger val = BigInteger.valueOf(0);
            BigInteger tmp1, tmp2;
            char[] valStr = new char[100];
            int valStrlen = 0;
            
            while ( (Prob = init()).compareTo("End") != 0 )
            {
                flag = true;
                len = Prob.length();
                ss = Prob.toCharArray();
                top = 0;
                topShu = 0;
                topOp = 0;
                val = ZERO;
                valStrlen = 0;
                int first = 0;
                
                for ( i = 0; flag && i < len; ++i )
                {
                    if ( ss[i] >= '0' && ss[i] <= '9' )
                    {
                        valStr[ valStrlen++ ] = ss[i];
                        if ( valStrlen > 90 )
                        {
                            flag = false;
                            break;
                        }
                        if( first == 0 ) first = 1;
                    }
                    else
                    {    
                        if ( ss[i] == '(' ) 
                        {
                            if ( first == 0 ) first = 2;
                            ++top;
                        }
                        else if ( ss[i] == ' ' ) continue;
                        else
                        {    
                            if ( valStrlen != 0 )
                            {
                                val = ZERO;
                            
                                for ( j = 0; j < valStrlen; ++j )
                                {
                                    val = val.multiply(TEN);
                                    val = val.add( BigInteger.valueOf( valStr[j]-'0' ) );
                                }
                                //System.out.println(val);
                                //System.out.println("------------");
                                valStrlen = 0;
                                shu[ ++topShu ] = val;
                            }
                            if ( ss[i] == ')' ) 
                            {    
                                --top;
                                tmp2 = shu[ topShu ];
                                tmp1 = shu[ --topShu ];
                                
                                //System.out.println("******");
                                //System.out.println(topShu);
                                //System.out.println("++++++");
                                //System.out.println(tmp1);
                                //System.out.println(tmp2);
                        
                                switch( oper[ topOp ] )
                                {    
                                case '+': tmp1 = tmp1.add(tmp2); break;
                                case '-': tmp1 = tmp1.subtract(tmp2); break;
                                case '*': tmp1 = tmp1.multiply(tmp2); break;
                                case '/': 
                                    if ( tmp2.compareTo(ZERO) == 0 )
                                    {
                                        flag = false;
                                        break;
                                    }
                                    tmp1 = tmp1.divide(tmp2); 
                                    break;
                                }
                                //System.out.println(tmp1);
                                //System.out.println("++++++");
                        
                                --topOp;
                                if ( tmp1.compareTo(MAXX) > 0 || tmp1.compareTo(ZERO) < 0 )
                                {
                                    flag = false;
                                    break;
                                }
                                shu[ topShu ] = tmp1;
                                //System.out.println(tmp1);
                                val = ZERO;
                            }
                            else if ( ( GetOp = GetOper(ss[i]) ) == true )
                            {    
                                oper[ ++topOp ] = ss[i];
                            }
                        }
                    }
                }
                
                //System.out.println(topShu);
                //System.out.println("####");
                //for ( i = 0; i <= topShu; ++i )
                    //System.out.println(shu[i]);
                
                if ( flag ) 
                {
                    if ( first == 2 ) System.out.println(shu[1]);
                    else 
                    {
                        val = ZERO;
                        
                        for ( j = 0; j < valStrlen; ++j )
                        {
                            val = val.multiply(TEN);
                            val = val.add( BigInteger.valueOf( valStr[j]-'0' ) );
                        }
                        //System.out.println(val);
                        //System.out.println("------------");
                        if ( val.toString().length() > 90 ) System.out.println("Error");
                        else System.out.println( val );
                    }
                }
                else System.out.println("Error");
            }
                
        }
    }
  • 相关阅读:
    WPF之Binding基础八 使用Linq数据作为Binding的源
    WPF之Binding基础七 使用XML数据作为Binding的源
    WPF之Binding基础六 使用ADO.NET作为Binding的数据源
    WPF之Binding基础五 使用集合对象作为列表控件的ItemSource
    WPF之Binding基础四 使用DataContext作为Binding的源
    解决 VS的IISExpress localhost可以访问,127.0.0.1和本机ip访问不了(错误400)
    c# 使用特性封装提供额外行为Validate验证
    c# 反射调用方法、获取设置值、好处和局限性
    c# 反射加读取类、方法、特性、破坏单例
    linq to object使用
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3209656.html
Copyright © 2020-2023  润新知