检查int []的值是否可以很长

时间:2010-01-21 05:07:34

标签: java long-integer

我有一系列的整数,即。 [1,2,3,4,5]。每行对应十进制值,因此5是1,4是10,3是100,它给出了我计算和存储的12345的值。 这是功能:

public long valueOf(int[]x) {

    int multiplier = 1;
    value = 0;
    for (int i=x.length-1; i >=0; i--) {
        value += x[i]*multiplier;
        multiplier *= 10;
    }
    return value;
}

现在我想检查其他int []的值是否在我用valueOf()计算其值之前不会超过。怎么检查? 我应该使用table.length还是将其转换为String并发送到

public Long(String s)?

或者只是添加异常来抛出valueOf()函数?

3 个答案:

答案 0 :(得分:4)

我希望你知道这是一种存储大整数的可怕方法:只需使用BigInteger

但是如果你真的想要检查超过某个值,只需确保数组的长度小于或等于19.然后你可以将每个单元格与Long.MAX_VALUE中的值进行单独比较。或者你可以使用BigInteger。

答案 1 :(得分:1)

简短回答:所有多头都适合18位数。因此,如果您知道没有前导零,那么只需检查x.length< = 18。如果您可能有前导零,则必须循环遍历数组以计算数量并相应地进行调整。

这样做的一个缺陷是,一些19位数字是有效的长数,即那些小于,我相信它的数字,9223372036854775807。所以,如果你想要真正精确,你必须说长度> 19是坏,长度< 19好,长度== 19你必须逐个数字检查。根据您的目标,拒绝真正有用的数字子集可能是可以接受的。

正如其他人暗示的那样,更大的问题是:你为什么要这样做?如果这是某种数据转换,你可以从一些外部源获取数字作为一串数字,并需要将其转换为很长,很酷。如果您正在尝试创建一个类来处理大于适合长期的数字,那么您所做的就是效率低下且不必要。效率低,因为你可以将一个以上的十进制数字打包到一个int中,这样做可以提供各种存储和性能改进。不必要,因为BigInteger已经这样做了。为什么不直接使用BigInteger?

当然,如果这是一个家庭作业问题,那就是另一回事了。

答案 2 :(得分:0)

您是否保证x的每个值都是非负的?

如果是这样,你可以这样做:

public long valueOf(int[]x) {

    int multiplier = 1;
    long value = 0;  // Note that you need the type here, which you did not have
    for (int i=x.length-1; i >=0; i--) {
        next_val = x[i]*multiplier;
        if (Long.MAX_LONG - next_val < value) {
          // Error-handling code here, however you 
          // want to handle this case.
        } else {
          value += next_val
        }
        multiplier *= 10;  
    }
    return value;
}

当然,BigInteger会让这更简单。但我不知道你的问题规格是什么。