我试图在C++变量中放置一个大数字.号码是600851475143
我尝试了unsigned long long int但是错误地说它常量太大了.然后我尝试了一个名为BigInt的bigInt库 - > http://mattmccutchen.net/bigint/
问题是我无法编译代码,因为我收到很多关于lib的错误.
未定义的引用`BigInteger :: BigInteger(int)'< - 很多这些.
到目前为止,这是我的代码:
#include "string"
#include "iostream"
#include "bigint/NumberlikeArray.hh"
#include "bigint/BigUnsigned.hh"
#include "bigint/BigInteger.hh"
#include "bigint/BigIntegerAlgorithms.hh"
#include "bigint/BigUnsignedInABase.hh"
#include "bigint/BigIntegerUtils.hh"
using namespace std;
int main() {
//unsigned long int num = 13195;
//unsigned long long int num = 600851475143;
BigInteger num = 13195;
int divider = 2;
//num = 600851475143;
while (1) {
if ((num % divider) == 0) {
cout << divider << '\n';
num /= divider;
} …Run Code Online (Sandbox Code Playgroud) 据我所知,BigInts通常在大多数编程语言中实现为包含数字的数组,例如:当添加其中两个时,每个数字都是一个接一个地添加,就像我们从学校知道的那样,例如:
246
816
* *
----
1062
Run Code Online (Sandbox Code Playgroud)
其中*表示存在溢出.我在学校这样学习,所有BigInt添加函数我已经实现了类似于上面例子的工作.
所以我们都知道我们的处理器只能本地管理从0到2^32/的整数2^64.
这意味着大多数脚本语言为了高级并提供具有大整数的算术,必须实现/使用BigInt库,这些库使用整数作为上面的数组.但当然这意味着它们将比处理器慢得多.
所以我问自己的是:
它可以像任何其他BigInt库一样工作,只是(很多)更快,更低一级:处理器从缓存/ RAM中取一个数字,添加它,然后再将结果写回来.
对我来说似乎是一个好主意,为什么不是那样的?
我正在研究一个项目(在Scala中),我需要操作一些非常大的数字; 太大而不能用积分类型来表示.Java提供了BigInteger和BigDecimal类(scala提供了一个很好的瘦包装器).但是,我注意到这些库比我过去使用的其他任意精度库(即http://www.ginac.de/CLN/)慢得多,并且速度差异似乎大于可归因的值仅靠语言.
我对我的程序进行了一些分析,并且44%的执行时间用于BigInteger乘法方法.我想加快我的程序,所以我正在寻找比BigInteger类(及其Scala包装器)更快更有效的选项.我看过LargeInteger(来自JScience)和Aint(来自Afloat).但是,两者似乎都比标准的BigInteger类执行得慢.
有没有人知道Java(或在JVM上可用)任意精度数学库,重点是高性能整数乘法和加法?
SSE/AVX寄存器可以被视为整数或浮点BigNums.也就是说,人们可以忽视存在通道.是否有一种简单的方法可以利用这种观点并将这些寄存器单独或组合用作BigNum?我问,因为我从BigNum库中看到的很少,它们几乎普遍存储并对数组进行算术运算,而不是SSE/AVX寄存器.可移植性?
例:
假设您将SSE寄存器的内容存储为a中的键std::set,您可以将这些内容作为BigNum进行比较.
在.NET 4 beta 2中,有一个新的Numerics命名空间 struct BigInteger.该文件指出,这是一个不变的类型,因为我本来期望.
但我对后增量运算符(++)有点困惑.这种defintely似乎改变了价值.以下while循环有效:
static BigInteger Factorial(BigInteger n)
{
BigInteger result = BigInteger.One;
BigInteger b = BigInteger.One;
while (b <= n)
{
result = result * b;
b++; // immutable ?
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这就是MSDN对Increment运算符的看法:
因为BigInteger对象是不可变的,所以Increment运算符创建一个新的BigInteger对象,其值比value表示的BigInteger对象多一个.因此,重复调用Increment可能很昂贵.
一切都很好,我会理解,如果我必须使用, b = b++但显然++本身就足以改变一个价值.
有什么想法吗?
编辑:
正如Lasse所指出的那样,对增量后工作的方式有一个逐步的说明.但这仍然似乎与不变性有关.例如,我无法想象使用此运算符是线程安全的.
任何人都可以帮助我将18位数字字符串数字转换为java中的BigInteger
ie;字符串"0x9999999999999999"应显示为0x9999999999999999数值.
从应用程序开发团队的角度来看,处理整数溢出(如999999*999999(结果> Integer.MAX_VALUE))的常见做法是什么?
人们可以BigInt强制要求并禁止使用Integer,但这是一个好/坏的想法?
我正在研究Project Euler问题(目前问题13).
对于这个问题,我必须找到100个数字之和的前10位数字,其大小与此相似:
91,942,213,363,574,161,572,522,430,563,301,811,072,406,154,908,250
Run Code Online (Sandbox Code Playgroud)
我想我可以使用像Java的BigInteger这样的东西,但我开始用JavaScript解决问题(我试图提高我的js工作能力),我想继续使用它,甚至解决这个问题.
如果可能的话,我想坚持使用纯JS.
我是C#的新手并且遇到了以下代码的问题(我的目标框架为4.5,我添加了对System.Numerics的引用):
using System;
using System.Numerics;
namespace Test
{
class Program
{
static BigInteger Gcd(BigInteger x, BigInteger y)
{
Console.WriteLine("GCD {0}, {1}", x, y);
if (x < y) return Gcd(y, x);
if (x % y == 0) return y;
return Gcd(y, x % y);
}
static void Main(string[] args)
{
BigInteger a = 13394673;
BigInteger b = 53578691;
Gcd(a, b);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当通过调试启动发布版本时(Visual Studio中的F5 - 以及程序结束时的断点,以便我可以看到输出),我得到以下输出:
GCD 13394673, 53578691
GCD 53578691, 13394673
GCD 13394673, 13394672
GCD 13394672, 1
Run Code Online (Sandbox Code Playgroud)
但是,在没有调试(Ctrl-F5)的情况下启动发布版本时,我得到以下内容:
GCD …Run Code Online (Sandbox Code Playgroud) 任意精度有符号整数几乎总是使用符号数值表示来实现:
对符号数值的明显偏好与固定宽度有符号整数类型中对二进制补码的近乎普遍的偏好形成鲜明对比。问题是,为什么符号数值对于 BigIntegers 来说如此明显是首选?(如果您不同意前提,我欢迎反例。)
请注意,BigInteger API 通常为重要的位运算指定“如同二进制补码”语义(例如Java、Python )。这提供了与这些操作的通常含义的一致性。这并不规定实际的内部表示(仅是实现细节),但如果其他条件相同,它应该是支持在内部使用二进制补码的一点。
浮点数使用符号数值,与使用二进制补码的整数不同。不过,浮点并不是真正的指导先例,因为浮点运算的行为和算法与整数运算有很大不同。Bignum 更像整数而不是浮点数。
我们知道“教科书”上为什么补码在数学上起作用以及为什么它有优点的原因。在我看来,这些原因同样适用于整数和大整数。这在多大程度上是真的?
当然,硬件固定精度整数和软件任意精度整数的设计约束之间存在巨大差异。从这个意义上说,看到设计师在这些不同的领域做出不同的权衡一点也不奇怪。那么,应用于任意精度整数时,符号-数值和补码之间的权衡是什么?例如,这可能涉及某些重要算法的性能或简单性。
我希望您的回答能够阐明 BigInteger 算术的设计注意事项,并帮助我从新的角度重新审视我对补码的了解。
(需要明确的是:当我说任意精度整数的二进制补码时,我的意思是使用单词数组的表示,其位模式放在一起时是所需数字的二进制补码表示 - 也许还有额外的要求没有“不必要的前导 0”(对于非负数)或“不必要的前导 1”(对于负数)。)