这两天学了一下JAVA的语法,还没有学习后面的核心地方,突然间觉得JAVA这门语言很棒,我要在接下来的时间系统的学习一下。就这么愉快地决定了。
Java对于大数计算这方面的优势很大。最重要的是代码量小了(时间复杂度我有点拿不准)。于是针对这两天对Java的摸索,写一篇日志。记录一下针对ACM来说常用的Java方面的东西。
1、输入
首先要想输入需要先包括:
我们需要其中的 Scanner类声明的对象来扫描控制台输入。
针对A+B来说:(如果看不懂,请自行翻书,都讲得很清楚)
读一个整数: int n = cin.nextInt(); 相当于 scanf("%d", &n); 或 cin >> n;
读一个字符串:String s = cin.next(); 相当于 scanf("%s", s); 或 cin >> s;
读一个浮点数:double t = cin.nextDouble(); 相当于 scanf("%lf", &t); 或 cin >> t;
读一整行: String s = cin.nextLine(); 相当于 gets(s); 或 cin.getline(...);
读一个大数: BigInteger c = cin.nextBigInteger();
不过需要注意的是它们没有像scanf一样有判断是否输入到结尾的功能。
这时候需要用一个Scanner类的方法hasnext()来判断是否输入到文件结尾;
2、输出:
当然,输出的时候也有对小数位数处理的方法:
0代表当前位向后都是0就输出0占位,#代表若当前位向后都是0就不输出这些位上的数字。
3、高精度
对于大数来说,Java提供了BigDecimal和BigInteger两个类,都包含在java.math.*里面。
BigInteger是大整形类,BigDecimal是大浮点型类。
这两个类产生的对象没有数据范围,只要你的电脑内存足够就可以。
下面用BigInteger举个例子:
4、进制转换
java一直就是作弊器一般的存在,就像它的进制转换函数一样:
5、字符串
Java中的String 和char数组是完全不同的两种东西。
String中的字符是不能在原位置改变的,要改变必须改变并保存到新的String里,或者保存到char 数组里再修改
JAVA输入输出优化
用Scanner输入就像cin那样比较慢,当数据量一大会超时的,此时不得不用StreamTokenizer 和 PrintWriter
JAVA里一些常用的函数;
Arrays.sort(a);//排序,a是数组名,即地址
Arrays.binarySearch(a,x);//二分查找
System.out.println(a.add(b).stripTrailingZeros().toPlainString()); //去掉末尾的0 并转换成无科学计数法的字符串输出
//stripTrailingZeros()这个方法是用来去掉末尾的0的。
//toPlainString()这个方法是使字符串大数变成普通的数字字符组成的字符串,
//如果不使用这个方法很可能数字变成了科学计数法,带E的那种。
BigInteger.valueOf(1);//把1强制转换成大数类
cin.hasNextBigInteger();//输入大数!=EOF
s.equals("/");//判断字符串是否相等,与C++十分不同
.toPlainString.repalceAll(^0, "")去掉科学计数法和最前面的0.