我有一系列的整数,即。 [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()函数?
答案 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会让这更简单。但我不知道你的问题规格是什么。