如何在python中找到非常大的数字a^b?
我试图找出python中的如何在python中找到非常大的数字a^b?,python,Python,我试图找出python中的a^b,真正的大数字 我的代码是: 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:/Py
a^b
,真正的大数字
我的代码是:
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
raceback(最近一次通话最后一次):
文件“C:/Python26/lastdig.py”,第7行,在
c、 延长(pow(a、b))
TypeError:“int”对象不可编辑
我的问题出了什么问题?这是求大数幂的有效方法吗?你应该试试。尝试以下方法:
import gmpy
a = gmpy.mpz(10**10)
b = a**10000000
我不知道你的数字有多大,这个解决方案没有那么快(但结果足够大:p)另一种计算指数的方法是使用对数定律 x^y=e^(y-lnx)
我不能肯定,但这可能会减少计算大指数所需的运算量。python整数运算是任意精度的 如果需要任意精度浮点运算,请导入十进制
from decimal import *
d=Decimal('2.0')
print d**1234
10000**10000次打印在我的机器上,不到一秒钟 你的投入有多大 你的问题与幂函数无关 使用 而不是
c.extend()
c、 extend将一个iterable(列表/元组/集合/自定义iterables)作为输入。您使用extend是错误的。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
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)`
def exp(基数,指数):
四舍五入(指数,0)
如果指数<0:
返回1.0/exp(基数,-1*指数)
如果指数=0:
返回1
如果指数>0:
返回基数*exp(基数,指数-1)`
遗憾的是,这只适用于整数指数。?您的第7行没有extend,您有append,这不会导致这样的错误。请提供您给程序的输入。另外,你确定你提供的源代码和错误匹配吗?你的问题和你的错误是两个完全不同的野兽。这段代码在我的机器上工作(Python 3,将原始输入更改为输入)。另一方面,为什么不使用a**b而不是pow(a,b)?我很想知道这是否有助于提高性能;这完全取决于python对pow()的实现。我正在等待一些专家对此的评论。pow()是通过重复平方来完成的,因此它非常有效。对于中等大小的数字,对数大约相同或稍快,但pow()通常优于pow(),因为它计算的是精确答案,而不是浮点近似值,并且不会在大数字上溢出。嘿,我尝试了exp(21000)和viola max递归深度!
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)`