留着当个模板用,在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");
} }
}

BNU OJ 33691 / LA 4817 Calculator JAVA大数的更多相关文章

  1. java大数

    java大数还是很好用的! 基本加入: import java.math.BigInteger; import jave.math.BigDecimal; 分别是大数和大浮点数. 首先读入可以用: S ...

  2. JAVA大数运算

    java大数是个好东西,用起来方便,代码短. 代码如下: import java.util.*; import java.math.*; public class Main { public stat ...

  3. java大数总结【转】

    java大数(2013长春网络赛)--hdu4762总结一下:1.java提交类要写Main.2.读取大数. Scanner read=new Scanner(System.in); BigInteg ...

  4. HDU5047Sawtooth(java大数)

    HDU5047Sawtooth(java大数) 题目链接 题目大意:在一个矩形内画n个"M".问如何画可以把这个矩形分成最多的区域. 给出这个区域的数目. 解题思路:最好的方式就是 ...

  5. JAVA大数类

    JAVA大数类api http://man.ddvip.com/program/java_api_zh/java/math/BigInteger.html#method_summary 不仅仅只能查J ...

  6. HDU4762(JAVA大数)

    Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. ZOJ3477&JAVA大数类

    转:http://blog.csdn.net/sunkun2013/article/details/11822927 import java.util.*; import java.math.BigI ...

  8. 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&amp;记忆化递归

    HDU 4911 Inversion 考点:归并排序 思路:这题呀比赛的时候忘了知道能够用归并排序算出逆序数,可是忘了归并排序的实质了.然后不会做-- 由于看到题上说是相邻的两个数才干交换的时候.感觉 ...

  9. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

随机推荐

  1. orcale 修改字段属性

    有些时候,因为没能预料到一些情况的变化,需要修改字段的类型.如果是varchar型,直接增加长度是可以的,但是如果需要修改成其他类型就不能这么做了. 思路:1.增加一个临时列,把需要修改的那个字段的数 ...

  2. Linux之mount命令详解

    linux下挂载(mount)光盘映像文档.移动硬盘.U盘.Windows和NFS网络共享linux是个优秀的开放源码的操作系统,能够运行在大到巨型小到掌上型各类电脑系统上,随着linux系统的日渐成 ...

  3. Java中的继承和多态

    1.  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类更具体.父类具有更 ...

  4. matlab实现高斯消去法、LU分解

    朴素高斯消去法: function x = GauElim(n, A, b) if nargin < 2 for i = 1 : 1 : n for j = 1 : 1 : n A(i, j) ...

  5. cocos2dx中的触摸事件及触摸优先级

    1.只有CCLayer及其派生类才有触摸功能. 2.开启触摸 setTouchEnable(true); 3.设置触摸模式,单点,多点(仅IOS支持) setTouchMode(kCCTouchesO ...

  6. C语言基础:数组和字符串

    数组:数组的定义注意点 数组初始化正确写法: int args[5] = {1,23,32,4,5}; int args[5] = {12,23}; int args[5] = {[3]=23, [4 ...

  7. iOS xcode 8 注释快捷键

    单行注释:在方法的地方按 Command+/ 标注的功能,快捷键是Command + Option + / 需要在方法名的上面(空白)的地方按 Command + Option + /      才管 ...

  8. swift 类 与 结构体

    这两天突然有人问我  swift里面 类和 结构体  有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift  语言 ...

  9. 详解HTML5中的<aside>元素与<article>元素

    <aside>元素HTML<aside>元素表示一个页面的一部分, 它的内容跟这个页面的其它内容的关联性不强,或者是没有关联,单独存在.<aside>元素通常显示成 ...

  10. 【POJ】【1704】Georgia and Bob

    组合游戏 Nim游戏的一个变形 题解请看金海峰的博客 以下为引用: 分析:我们把棋子按位置升序排列后,从后往前把他们两两绑定成一对.如果总个数是奇数,就把最前面一个和边界(位置为0)绑定. 在同一对棋 ...