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 ...
随机推荐
- python之input(), raw_input()
input(): 要求输入合法的python表达式, 例如字串需要加"", 四则运算会自动计算. raw_input():所有输入视作字串 >>> val=inp ...
- 【jquery】javaScript中prototype的妙用 巧妙运用prototype属性原型链创建对象
prototype 可以有好多有优化实现方法 http://blog.csdn.net/liuqiwen0512/article/details/8089690 在 JavaScript 中,每个函 ...
- CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.13+博客系统WordPress3.3.2
说明: 操作系统:CentOS 6.2 32位 系统安装教程:CentOS 6.2安装(超级详细图解教程): http://www.osyunwei.com/archives/1537.html 准备 ...
- ADT eclipse打开时出现Error: Error parsing C:\Users\admin*\.android\devices.xml
Error: Error parsing C:\Users\admin*\.android\devices.xml 在ADT eclipse打开项目的时候出现此提示,但是又不影响使用. 原因:之前安 ...
- 备份apt目录节省下载时间
备份与清理 * 备份快速设置已下载的部分软件包,以便重装系统再次使用,免去重新下载的时间 tar cizvf backup.tar.gz /var/cache/apt/archives ...
- IOS 后台运行
默认情况下,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作.但是应用可以调用UIApplication的beginBackgroundTaskWithExpirat ...
- WinForm员工信息表
先搞一个panel,然后里面放label.
- 【C++基础】 类中static private public protected
静态成员在一个类的所有实例间共享数据 “类属性”,是描述类的所有对象共同特征的一个数据项,对所有对象,它的值相同,static定义,为整个类所共有.相对于“实例属性” 如果static成员是私有类型, ...
- C++中的const关键字
http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...
- Java的synchronized关键字:同步机制总结
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...