HDUOJ-1002
程序员
刷题
ACM
1. 题目: Big Number Sum (Clik Me)
2. 我的解答:
import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static String addAsBigInteger(String a, String b){
return (new BigInteger(a)).add(new BigInteger(b)).toString();
}
public static void main(final String[] args) throws IOException {
Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int caseNumber = 0;
if (in.hasNext()) {
caseNumber = in.nextInt();
}
for (int j = 0; j<caseNumber; j++) {
if (in.hasNext()) {
String a = in.next();
String b = null;
if (in.hasNext()) {
b = in.next();
}
out.printf("Case %s:\r\n", (j+1));
if( j == caseNumber-1) {
out.printf("%s + %s = %s\r\n", a, b, addAsBigInteger(a, b));
}else{
out.printf("%s + %s = %s\r\n\r\n", a, b, addAsBigInteger(a, b));
}
}
}
out.flush();
}
}
3. 运行结果
运行速度和所用的内存,和C/C++相比,完全不行。代码长度也不大行,因为Java的特色就是语法冗长。无论如何,我先做对了再说吧。
4. 解题思路
一开始的想法是自己分析字符串,每9位(因为Java Integer 是最大值是10位)一组,进行加法计算,该进位的地方加上进位。实现的时候遇到了不少问题。在后面的《遇到的问题与分析》会稍微总结一下这些遇到的问题。后来一想,为什么要自己实现呢?为什么不直接用JDK的东西呢?JDK就是Java语言的强项?虽然自己实现可以锻炼更多编程能力,考虑到我想先把做题的数量提上去,所以决定尽快解决这个问题,就直接用了Java的BigInteger。代码量还特别少。主要问题就是输出格式的问题,核心的大数加法就交给JDK吧!
5. 遇到的问题,分析与经验:
5.1 Math.ceil(intA/intB)
类库用法错误。显然ceil操作是面向double的,所以一定要想办法让参数转为double: Math.ceil(intA/(double)intB)。
经验就是,整数除法一定要小心。整数除法是计算机所不擅长的。
5.2 在算进位的时候,遇到溢出
考虑如下代码,
int a=(int)1E10;
System.out.println(a);
你认为会输出啥呢?编译器会报错吗?
编译器不会报错,输出时2147483647。这个数字就是传说中的Integer.MAX_VALUE. 原因其实大家都懂。问题是为什么编译器不做检查呢?为什么呢?
5.3 System.out.println()与System.out.print("\n")的区别
在windows平台上, println会输出 "\r\n", 但是print("\n")当然只会输出"\n". OnlineJudge平台会区别对待这两种换行,这货只认"\r\n"。否则,这货会抱怨Presentation Error.