代码之家  ›  专栏  ›  技术社区  ›  Yes - that Jake.

在Python中处理非常大的数字

  •  98
  • Yes - that Jake.  · 技术社区  · 17 年前

    我一直在考虑用Python进行快速扑克手评估。我突然想到,加快这个过程的一种方法是将所有的牌面和牌套表示为素数,然后将它们相乘来表示手。致:

    class PokerCard:
        faces = '23456789TJQKA'
        suits = 'cdhs'
        facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61]
        suitPrimes = [2, 3, 5, 7]
    

        def HashVal(self):
          return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]
    

    这将给每只手一个数值,通过模可以告诉我有多少国王在手上或有多少颗心。例如,任何有五根或更多棍棒的手都会被2^5平分;任何有四个国王的手都会被59^4等分,以此类推。

    问题在于,像AcAdAhAsKdKhKs这样的七张牌的散列值约为627万亿,这将需要相当多的32位才能在内部表示。有没有一种方法可以在Python中存储如此大的数字,从而允许我对其执行算术运算?

    4 回复  |  直到 12 年前
        1
  •  202
  •   Ben Blank Jarret Hardie    17 年前

    Python支持“bignum”整数类型,可以处理任意大的数字。在Python 2.5+中,这种类型称为 long 并且是独立于 int 输入,但解释器将自动使用更合适的。在Python 3.0+中 类型已完全删除。

    你可以在书中找到所有血淋淋的细节 PEP 0237 .

        2
  •  93
  •   hedy    5 年前

    python支持 任意地 大的 整数 自然地:

    >>> 10**1000
    10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    

    例如,您甚至可以得到一个巨大的整数值fib(4000000)。

    但它仍然存在 浮动 !!

    OverflowError: (34, 'Result too large')

    另一参考: http://docs.python.org/2/library/decimal.html

    Handling big numbers in code

    另一参考: https://code.google.com/p/gmpy/

        3
  •  38
  •   Tom Tom    17 年前

    • 获得手中的卡将是一个整数分解操作,这比仅仅访问一个数组要昂贵得多。

        4
  •  30
  •   Autoplectic    17 年前

    In [1]: 59**3*61**4*2*3*5*7*3*5*7
    Out[1]: 62702371781194950
    In [2]: _ % 61**4
    Out[2]: 0
    
        5
  •  9
  •   hedy    5 年前

    这个 int 价值是无限的。

    进行除法时要小心,默认情况下,商会变成 float 浮动 不支持这么大的数字。如果您收到一条错误消息 浮动 你必须使用楼层划分( //

    它忽略小数点后的任何小数点,这样,结果将是 int ,因此可以得到大量结果。

    >>>10//3
    3
    
    >>>10//4
    2
    
    推荐文章