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");
} }
}
BNU OJ 33691 / LA 4817 Calculator JAVA大数的更多相关文章
- java大数
java大数还是很好用的! 基本加入: import java.math.BigInteger; import jave.math.BigDecimal; 分别是大数和大浮点数. 首先读入可以用: S ...
- JAVA大数运算
java大数是个好东西,用起来方便,代码短. 代码如下: import java.util.*; import java.math.*; public class Main { public stat ...
- java大数总结【转】
java大数(2013长春网络赛)--hdu4762总结一下:1.java提交类要写Main.2.读取大数. Scanner read=new Scanner(System.in); BigInteg ...
- HDU5047Sawtooth(java大数)
HDU5047Sawtooth(java大数) 题目链接 题目大意:在一个矩形内画n个"M".问如何画可以把这个矩形分成最多的区域. 给出这个区域的数目. 解题思路:最好的方式就是 ...
- JAVA大数类
JAVA大数类api http://man.ddvip.com/program/java_api_zh/java/math/BigInteger.html#method_summary 不仅仅只能查J ...
- HDU4762(JAVA大数)
Cut the Cake Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- ZOJ3477&JAVA大数类
转:http://blog.csdn.net/sunkun2013/article/details/11822927 import java.util.*; import java.math.BigI ...
- 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&记忆化递归
HDU 4911 Inversion 考点:归并排序 思路:这题呀比赛的时候忘了知道能够用归并排序算出逆序数,可是忘了归并排序的实质了.然后不会做-- 由于看到题上说是相邻的两个数才干交换的时候.感觉 ...
- 收藏的一段关于java大数运算的代码
收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...
随机推荐
- linux 文件属性
关于属性的结构 在linux下文件和文件夹都被认为是文件, 所以以下的这个属性对文件和文件夹通用 获取属性的函数有stat/fstat/lstat/fstat struct stat{ mode_t ...
- php微型mvc框架创建步骤
创建数据库和表结构,并且添加模拟数据: 新建models.views.controllers.utilities和include五个文件夹:models:模型层 model.php:模型基类 ...
- 斐波那契(Fibonacci)数列的七种实现方法
废话不多说,直接上代码 #include "stdio.h" #include "queue" #include "math.h" usin ...
- 编译linux内核问题
1: openssl/opensslv.h: No such file or directory sudo apt-get install libssl-dev 2:一般配置内核树,需要先make o ...
- iOS多线程编程Part 2/3 - NSOperation
多线程编程Part 1介绍了NSThread以及NSRunLoop,这篇Blog介绍另一种并发编程技术:NSOPeration. NSOperation & NSOperationQueue ...
- IOS应用开发版本控制工具之Versions使用
Versions版本控制工具破解版(Versions.zip)下载请见本博文附件.下载后在MAC安装完以后,图标是莲花状.见下图: 双击运行如下图: 点击Repository,连接SVN服务器R ...
- 阿里云mysql数据库恢复总结,mysql binlog日志解析
由于意外..阿里云mysql中有一张表被全部删除了,深吸三口气候,开始解决. 首先用凌晨的自动备份的,进行全量恢复,然后找binlog日志(见下文),查找从全量备份到数据删除之间的记录 这导致了一个问 ...
- DataGridView 使用CheckBox选中行
在winform中使用checbox很多.上次那个项目里就用到了,写了一个不太好用,后来翻阅了一下微软提供的样码,我觉得有必要给大家分享一下. // This event handler manual ...
- ORACLE 变量定义
DECLARE v_productid productinfo.productid%TYPE; v_productname ); v_productprice ,); v_quantity ); v_ ...
- ubuntu下搭建nfs,tftp,安装qt等一些基本的启动bootloader前的服务
之前做三星的6410是在红帽下做的,现在公司给了个TI的AM3359的开发板,开发环境是ubuntu10-04.这周经过半天的研究对比,终于算是搭好tftp下载的一些服务了. [防火墙] sudo u ...