水题练手POJ1503

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




转载于:https://www.cnblogs.com/leftcopy/archive/2012/03/07/2384229.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值