留着当个模板用,在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. HDFS命令行操作

    启动后可通过命令行使用hadoop. (1)所有命令 (先将$HADOOP_HOME/bin加入到.bashrc的$PATH变量中) [html] view plaincopy [hadoop@nod ...

  2. Shell 总结

    find: –name 'filenme' * ? [] ; –iname; –regex PATTERN; –user username; –group; –uid; –gid; –nouser; ...

  3. docker 感性体验

    Docker 1.0正式发布!1.0 版本包含很多新特性,这也是 Docker 的首个产品级的版本.从今天开始,你将会一直听到一个新的概念 —— Docker as a platform ,其组件包括 ...

  4. lnmp停用nginx,改用apache

    编译安装的lnmp环境 总是出现502错误,修改了各种配置也没用,暂时先放弃nginx,改用apache apache使用yum安装方式 需要注意的事项,将网站根目录的用户组改为 chown apac ...

  5. Unity 优化

    1. 尽量避免每帧处理比如: function Update() { DoSomeThing(); } 可改为每5帧处理一次: function Update() { == ) { DoSomeThi ...

  6. 对cnblogs.com用户体验的评价

    一.对于cnblogs.com的用户体验我们先对以下问题进行回答: 1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是正在学习软件工程课程的在校计算机专业大学生,在博 ...

  7. Windows Phone 8.1 与 Windows Phone 8.1 Silverlight区别

    以下讨论基于当前的WP8 APP, 一.Windows Phone 8 app:旧的WP8程序:不需要迁移: 二.Windows Phone 8.1 app新的使用Windows Runtime 的程 ...

  8. Java7 新特性 数值文本表示法

    今天和大家分享下 java7中新特性-数值文本表示法 首先,在原来jdk1.6中 如果需要将一个二进制的数值转换成十进制的话,一般情况下都会以下面的代码方式去实现. public static voi ...

  9. 【UVA】【11762】Race to 1(得到1)

    数学期望/马尔可夫过程 DP/记忆化搜索 刘汝佳老师白书上的例题…… //UVA 11762 #include<vector> #include<cstdio> #includ ...

  10. 【设计模式六大原则6】开闭原则(Open Close Principle)

      定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...