解法一:BigInteger
import java.math.BigInteger;
import java.util.Scanner;
/*
* 3408K 704MS
*/
public class _1503 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
BigInteger bi = new BigInteger("0");
String str;
while(!(str = sc.nextLine()).equals("0")){
bi = bi.add(new BigInteger(str));
}
System.out.println(bi);
}
}
小结:
1.由于java带有BigInteger类,问题退化成了A+B问题了;
2.使用BigInteger时要注意它的API比较特殊:
(1)必须使用equals方法而不是==来比较大小;
(2)不可以使用一般的运算加减乘除符号了,取而代之的是方法;
(3)BigInteger是不可改变类(immutable),add等方法并不会改变自身。
3.由于java的Scanner比较诡异,这里使用String类的构造函数效率较高。
解法二:数组
import java.util.Scanner;
/*
* 3284K 579MS --int arrays
* 3272K 610MS --byte arrays
*/
public class _1503_1 {
public static final int MAX = 105;
public static void main(String[] args){
byte sum[] = new byte[MAX];
String input;
Scanner sc = new Scanner(System.in);
while(!(input = sc.nextLine()).equals("0")){
for(int i = input.length() - 1,j = 0; i >= 0; i--,j++){
sum[j] += input.charAt(i) - '0';
if(sum[j]>=10){
sum[j] -= 10;
sum[j+1]++;
}
}
}
int i = MAX - 1;
while(sum[i--]==0);
for(i++;i >= 0; i--)
System.out.print(sum[i]);
}
}
小结:
1.String的顺序和数组的顺序相反,否则会比较混乱;
2.while(sum[i--]==0);这个语句总会自减;
3.并不需要考虑多次进位的问题,因为两两相加最多进位为1,然而在下一次进位中可以处理,最高位如果为10的话并不影响输出(例如为99……的情形)。
方法的比较:
在解法二中,运行时间及内存消耗都比使用BigInteger的小;使用int数组消耗的时间最小,使用byte数组消耗的内存最小(参见代码中注释)。记得JVM处理byte时还是要转化为int类型的,因此怀疑是这上面浪费了时间;如有错误,恳请指正。