RFC

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

POJ1503

解法一: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类型的,因此怀疑是这上面浪费了时间;如有错误,恳请指正。




posted on 2012-03-07 21:08  hongxuchen  阅读(246)  评论(0编辑  收藏  举报
无觅相关文章插件,快速提升流量