Java - 如何解析大型int作为命令行参数?

时间:2014-10-27 11:32:09

标签: java int

我需要编写一个适用于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();
            }
        }
    }
}

}

4 个答案:

答案 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 ^ 63 - 1的大数字,您可以使用long - 查看有关data types的更多信息,您需要将Integer.parseInt()更改为Long.parseLong()。
  • 如果你真的需要任意大数字,请使用BigInteger。为此,您还需要将变量k更改为BigInteger并使用BigInteger.multiply()代替* =并使用new BigInteger(String value)构建变量n

答案 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

,则会抛出异常