处理大量

时间:2010-05-23 06:07:25

标签: c++ bignum

来自Project Euler网站的Problem 3

解决后我没有出去,但我猜你会知道我的方法是什么。至于我现在的问题,如何处理超过unsigned int的数字?

是否有这样的数学方法,如果有,我在哪里可以阅读它?

7 个答案:

答案 0 :(得分:5)

您是否尝试过unsigned long long或更好/特别uint64_t

如果你想使用大于uint64_t [2 64 -1] [64位整数,无符号]范围的数字,那么你应该研究bignum:{{ 3}}

600,851,475,143是问题给出的数字,2 64 -1等于18,446,744,073,709,551,615。这绝对够大。

答案 1 :(得分:4)

最近教过一个孩子我知道素数分解,如果你有一个素数列表,这个算法是微不足道的。

  1. 从2开始,尽可能多地将其划分为目标,并留下零余数。
  2. 采取下一个素数(3)并将其划分为目标,如第一步
  3. 记下您找到的每个因素,然后重复,直到剩余的余数为止。
  4. 根据请求添加了算法伪代码:

    def factor(n):
        """returns a list of the prime factors of n"""
        factors = []
        p = primes.generator()
        while n > 1:
            x = p.next()
            while n % x == 0:
                n = n / x
                factors.append(x)
        return factors
    

    p.next()的连续调用会产生素数系列{2,3,5,7,11,...}中的下一个值 伪代码与实际工作的Python代码的任何相似之处纯属巧合。我可能不应该提到primes.generator()的定义是一行更短(但一行是50个字符长)。我最初编写这个“代码”是因为GNU factor程序不接受log 2 n )> = 40的输入。

答案 2 :(得分:0)

使用

long long

在GCC

__int64
VC中的

答案 3 :(得分:0)

使用

long long

GCC和较新版本的Visual Studio(2008年及以后,我相信)都支持此功能。

答案 4 :(得分:0)

处理问题的最简单方法可能就是使用Python。 Python版本> 2.5支持内置的长精度算术运算。精度仅取决于您的计算机内存。您可以从link找到有关它的更多信息。

答案 5 :(得分:0)

long long会针对该问题执行此操作。对于超过long long的其他Project Euler问题,我可能会使用libgmp(特别是其C++ wrapper classes)。

答案 6 :(得分:0)

在Windows中,如果编译器不支持64位整数,则可以使用LARGE_INTEGERULARGE_INTEGER