我有一个Java BigInteger类的问题:我无法将大值粘贴到BigInteger中.例如,假设我想为此数字指定一个BigInteger:
26525285981219105863630848482795
我无法直接分配它,因为编译器认为它是一个整数:
val bi = 26525285981219105863630848482795 //compile error
Run Code Online (Sandbox Code Playgroud)
但我希望它是一个BigInteger.有没有办法可以直接将其粘贴到源代码中?如果没有这种方式,那么在Scala中是否有一种方法,它有一个更容易使用的BigInt类?谢谢您的帮助.
从应用程序开发团队的角度来看,处理整数溢出(如999999*999999(结果> Integer.MAX_VALUE))的常见做法是什么?
人们可以BigInt强制要求并禁止使用Integer,但这是一个好/坏的想法?
我环顾四周,找到了其他有问题的答案,但没有一个问题涉及这个问题的范围.包括这个问题,还有这个问题.
我必须以有效的方式计算大范围数字的LCM.我对其他问题看起来并不太深入,因为它们没有处理与此算法必须处理的数字范围一样大的数字范围.
我现在得到的代码可以在大约90秒内计算1到350000之间的每个数字的最小值.(结果数字是大约76000十进制数字).我希望最终能够在数百万甚至数十亿元素的范围内扩展它.
它最终可能会被瘫痪.对于某些算法,这根本不会很难,对于其他算法,它会更棘手(例如,如果算法使用当前生成的LCM来计算其计算的其他部分的素数)
这里是:
public static BigInteger getLCMOfRange(BigInteger lower, BigInteger upper)
{
BigInteger M = BigInteger.ONE;
BigInteger t;
// long l = System.currentTimeMillis();
// System.out.println("Calculating LCM of numbers up to " + upper + "...");
for (; lower.compareTo(upper) != 1; lower = lower.add(BigInteger.ONE))
{
t = M.gcd(lower);
if (t.compareTo(lower) == 0)
continue;
M = M.multiply(lower).divide(t);
}
// System.out.println("Done. Took " + (System.currentTimeMillis() - l) + " milliseconds. LCM is " + M.bitCount()+ " bits …Run Code Online (Sandbox Code Playgroud) 我正在使用.NET BigInteger类来执行一些数学运算.但是,ModPow方法给了我错误的结果.我把它与Java比较,我认为是正确的:
// C#
var a = new BigInteger(-1);
var b = new BigInteger(3);
var c = new BigInteger(5);
var x = BigInteger.ModPow(a, b, c); // (x = -1)
// Java
BigInteger a = new BigInteger("-1");
BigInteger b = new BigInteger("3");
BigInteger c = new BigInteger("5");
BigInteger x = a.modPow(b, c); // (x = 4)
Run Code Online (Sandbox Code Playgroud)
它是.NET类中的错误还是我做错了什么?
我正在尝试获取Cassandra列族中的键值对的数量.以下是我使用的代码.
PreparedStatement statement = client.session
.prepare("select count(*) from corpus.word_usage");
ResultSet results = client.session.execute(statement.bind());
Row row = results.one();
System.out.println(row.getVarint(0));
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我遇到了异常.
Exception in thread "main" com.datastax.driver.core.exceptions.InvalidTypeException: Column count is of type bigint
at com.datastax.driver.core.ColumnDefinitions.checkType(ColumnDefinitions.java:291)
at com.datastax.driver.core.ArrayBackedRow.getVarint(ArrayBackedRow.java:185)
at SimpleClient.main(SimpleClient.java:57)
Run Code Online (Sandbox Code Playgroud)
根据datastax文档(http://www.datastax.com/drivers/java/2.0/com/datastax/driver/core/Row.html),getVarint应该返回一个BigInteger.那么为什么我在这里得到例外?我做错了什么?
我需要计算
result = (dividend * factor) / divisor
Run Code Online (Sandbox Code Playgroud)
哪里
dividend: full range of int64_t values
factor: either a full range of uint32_t values or as a special case 2^32
divisor: positive values of int64_t
result: is guaranteed to fit in a int32_t
Run Code Online (Sandbox Code Playgroud)
我需要在没有微控制器上的任何库的普通C/C++中执行此操作.编译器支持int64_t和uint64_t类型; 很可能没有用于乘法或除法的硬件实现.目前我有uint32_t因子的解决方法,但我需要因子2 ^ 32的解决方案.
我正在寻找Delphi Data.FmtBcd库的替代品,因为我只是达到它可以表示的最大十进制数字的限制,并且程序终止于EBcdOverflowException.对于好奇,我正在计算算术系列成员,需要处理非常大的数字 - 数十万个位置并不是那么罕见.并在合理的时间内获得结果.我确实将部分代码重写为Python 3.2用于测试目的,并且计算速度足以满足Delphi的要求.
有关此类库的一些建议,最好是免费还是开源?
直到今天,我(隐式)假设当我输出一个BigIntegervia参数无效(重写)实例方法时BigInteger.ToString(),返回字符串将包含我的"大"整数的完整和精确的十进制表示.
但在MSDN文档页面上,我读到:
"在大多数情况下,ToString方法支持50个十进制数字的精度.也就是说,如果BigInteger值超过50位,输出字符串中只保留50个最高有效数字;所有其他数字都替换为零.但是,BigInteger支持"R"标准格式说明符,用于往返数值.由ToString(String)方法返回的带有"R"格式字符串的字符串保留整个BigInteger值,然后可以使用Parse或TryParse方法恢复其原始值而不会丢失任何数据"._
但是,我还没有找到一个myBigInt.ToString()与之不同的例子myBigInt.ToString("R").在我的框架版本(.NET 4.0 SP1)中,上述页面中的备注示例并未提供示例.(此外"G"和"R"似乎是等效BigInteger).
假设无参数ToString()给出整数的完整十进制扩展是否安全?他们是否改变了框架行为,或者上面提到的示例代码总是错误的?
注意:在我写完这个之后,SO向我展示了这个"类似的问题"2984184,但是我仍然在提交我的问题,因为2984184的答案并没有真正规避零参数的ToString()工作原理.
由自己编辑:
ToString(String)当我的问题(主要是)关于ToString()过载时,我在MSDN 上链接过载有点不合适.因此,另请参阅MSDN,BigInteger.ToString()其中提到了50位数限制,但未提供超过50位数的示例.
如果你使用BigInteger(或BigDecimal),并希望对它们执行算术,你必须使用的方法add或subtract,例如.这听起来不错,直到你意识到这一点
i += d + p + y;
Run Code Online (Sandbox Code Playgroud)
会写成这样的BigInteger:
i = i.add(d.add(p.add(y)));
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,第一行阅读起来要容易一些.如果Java允许运算符重载但是没有,这可以解决,所以这引出了一个问题:
为什么不是BigInteger原始类型,因此它可以利用与其他原始类型相同的运算符?
我需要像BigIntegerJavascript 一样将字符串转换为bigint
例
var reqId = "78099864177253771992779766288266836166272662";
var result = parseInt(reqId);
document.write(result);
Run Code Online (Sandbox Code Playgroud)
由于JavaScript允许整数最多为2 ^ 53,因此结果值不匹配.
有没有办法克服这个问题?