我需要编写一个适用于n的所有值的短程序。 n是命令行参数(args [0])。问题是Integer.parseInt不适用于20000000000这样的大值。我该怎么做才能解决这个问题?该程序旨在打印所有2的幂的值,直到该值为> = n且n必须为参数[0]。
public class PowerOfTwo{
public static void main(String[] args){
int k = 1;
int n = Integer.parseInt(args[0]);
if(n < 0){
System.out.println("");
}else{
for(int i=1; k <= n; i++){
k *= 2;
if(k <= n){
System.out.println(k);
}else{
System.out.println();
}
}
}
}
}
答案 0 :(得分:2)
使用java.math.BigInteger或java.math.BigDecimal。这些可以处理任何数量的数字。
您的循环将如下所示:
public static void main(String[] args) {
final BigInteger TWO = new BigInteger("2");
BigInteger k = BigInteger.ONE;
BigInteger n = new BigInteger(args[0]);
if (n.compareTo(BigInteger.ZERO) < 0) {
System.out.println("< 0");
} else {
while (k.compareTo(n) <= 0) {
k = k.multiply(TWO);
if (k.compareTo(n) <= 0) {
System.out.println(k);
} else {
System.out.println();
}
}
}
}
答案 1 :(得分:0)
您希望处理的最大值是多少?
答案 2 :(得分:0)
请尝试以下代码:
public class PowerOfTwo{
public static void main(String[] args){
long k = 1;
long n = Long.parseLong("20000000000");
BigDecimal bigDec=new BigDecimal(n);
if(n < 0){
System.out.println("");
}else{
for(long i=1; k <= bigDec.longValue(); i++){
k *= 2;
if(k <= n){
System.out.println(k);
}else{
System.out.println();
}
}
}
}
}
输出
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824
2147483648
4294967296
8589934592
17179869184
答案 3 :(得分:0)
在我看来,最安全和最简单的方法是:
public class ReadBigInteger {
public static void main(String[] args) {
String number = args[0];
if (number == null) {
throw new IllegalArgumentException();
}
System.out.println("The number: " + number);
char [] tmp = number.toCharArray();
int result = 0;
int index = 1;
for (int t = tmp.length - 1; t >= 0; t--) {
int n = Integer.parseInt(tmp[t] + "");
int toAdd = (int) (n == 0 ? (Math.pow(10, index-1)) : (n * (Math.pow(10, index-1))));
if (toAdd > Integer.MAX_VALUE - result) {
throw new IllegalArgumentException("Number to large");
}
result += toAdd;
index++;
}
System.out.println("Entered integer: " + result);
}
}
基本上将参数作为字符串读取。通过构建整数来以相反的顺序解析它。如果结果大于Integer.MAX_VALUE