1

我有一个整数数组,即。[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;
}

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

公共长(字符串 s)?

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

4

3 回答 3

4

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

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

于 2010-01-21T05:16:22.923 回答
1

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

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

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

当然,如果是作业问题,那就另当别论了。

于 2010-01-21T06:27:05.197 回答
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 会使这变得更简单。但我不知道你的问题规格是什么。

于 2010-01-21T05:16:32.733 回答