Как узнать ^ b очень больших чисел в питоне? - PullRequest
0 голосов
/ 07 июня 2009

Я пытаюсь выяснить a^b в Python, действительно больших нет.

Мой код такой:

t=raw_input()
c=[]
for j in range(0,int(t)):
    n=raw_input()
    a=[]
    a,b= (int(i) for i in n.split(' '))
    c.extend(pow(a,b))
for j in c:
    print j

И я получаю сообщение об ошибке, подобное этому:

raceback (most recent call last):
  File "C:/Python26/lastdig.py", line 7, in <module>
    c.extend(pow(a,b))
TypeError: 'int' object is not iterable

Что не так в моем тесте и является ли это эффективным способом выяснить силы больших чисел?

Ответы [ 6 ]

3 голосов
/ 07 июня 2009

Вы используете расширение неправильно. A.extend (B) требует, чтобы B был каким-то итеративным объектом (т. Е. Списком, кортежем). Вы действительно хотите использовать append вместо этого.

t=raw_input()
c=[]
for j in range(0,int(t)):
    n=raw_input()
    a,b= (int(i) for i in n.split(' '))
    c.append( pow(a,b) ) ## or you could extend c.extend( [ pow(a,b) ] ), but thats silly.
for j in c:
    print j
2 голосов
/ 07 июня 2009

10000 ** 10000 отпечатков в моей машине менее чем за секунду.

Насколько велик ваш ввод.

Ваша проблема не связана с функцией питания.

Использование

c.append() 

вместо

c.extend()

c.extend принимает итерацию (список / кортеж / набор / пользовательские итерации) в качестве входных данных.

1 голос
/ 11 июня 2011

x**y отлично работает для экспонентов. Если вы хотите более оригинальное решение, вы можете использовать:

def exp(base, exponent):
  round(exponent, 0)
  if exponent < 0:
    return 1.0 / exp(base, -1 * exponent)
  if exponent == 0:
    return 1
  if exponent > 0:
    return base * exp(base, exponent - 1)`

К сожалению, это работает только для целочисленных показателей.

1 голос
/ 07 июня 2009

Операции с целыми числами Python имеют произвольную точность Если вы хотите, чтобы операции с плавающей запятой произвольной точности импортировали Decimal

from decimal import *
d=Decimal('2.0')
print d**1234
1 голос
/ 07 июня 2009

Вы должны попробовать GMPY . Попробуйте что-то вроде:

import gmpy
a = gmpy.mpz(10**10)
b = a**10000000

Я не знаю, насколько «велики» ваши цифры, это решение не такое быстрое (но результат достаточно большой: P)

0 голосов
/ 07 июня 2009

Еще один способ попробовать вычислить показатели степени - использовать законы логарифма.

x ^ y = e ^ (y ln x)

Не могу сказать наверняка, но это может уменьшить количество операций, необходимых для вычисления больших показателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...