pow()函数
调用方式1:pow(base, exp),base是底数,exp是指数。
返回 base 的 exp 次幂,等价于乘方运算符: base**exp。
>>>pow(3,2), 3**2
(9,9)
>>>pow(-3,2), (-3)**2
(9,9)
>>>pow(-3,0), (-3)**0
(1,1)
>>>pow(3.0,2), 3.0**2
(9.0,9.0)
>>>pow(3,2.0), 3**2.0
(9.0,9.0)
>>>pow(3.0,2.0), 3.0**2.0
(9.0,9.0)
>>>pow(3,-2), 3**-2
(0.1111111111111111, 0.1111111111111111)
>>>from fractions import Fraction
>>>pow(Fraction(3,2), 2), Fraction(3,2) ** 2
(Fraction(9, 4), Fraction(9, 4))
>>>pow(Fraction(3,2), -2), Fraction(3,2) ** -2
(Fraction(4, 9), Fraction(4, 9))
>>>pow(Fraction(3,2), 2.0), Fraction(3,2) ** 2.0
(2.25, 2.25)
>>>pow(3, Fraction(1,2)), 3 ** Fraction(1,2)
(1.7320508075688772, 1.7320508075688772)
>>>pow(Fraction(3,1),Fraction(1,2)), Fraction(3,1)**Fraction(1,2)
(1.7320508075688772, 1.7320508075688772)
总结:只有base是整数和exp是非负整数时才返回整数;只有base是分数,exp是整数才返回分数;其它实数总是返回浮点数。
支持负实数偶次开方、虚数和复数运算,当结果只有虚部,返回这个虚数,否则返回结果复数。
>>>pow(-1,0.5),(-1)**0.5
((6.123233995736766e-17+1j), (6.123233995736766e-17+1j))
>>>pow(1J,2),(1J)**2
((-1+0j), (-1+0j))
>>>pow(1,1J),1**1J
((1+0j), (1+0j))
>>>pow(1,2J),1**2J
((1+0j), (1+0j))
>>>pow(2,2J),2**2J
((0.18345697474330172+0.9830277404112437j), (0.18345697474330172+0.9830277404112437j))
>>>pow(1.0+1.0J,2),(1.0+1.0J)**2
(2j, 2j)
>>>pow(1+1J,1+2J),(1+1J)**(1+2J)
((0.027082057503447513+0.2927360563526886j), (0.027082057503447513+0.2927360563526886j))
调用方式2:pow(base, exp, mod),base是底数,exp是指数,mod是取余除数,三个参数都只能是整数,mod≠0。
exp是正整数,返回 base 的 exp 次幂对mod取余,比pow(base, exp) % mod高效:
>>>pow(0.5,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pow() 3rd argument not allowed unless all arguments are integers
>>>pow(10,2,3)
1
>>>pow(10,2,-3)
-2
>>>pow(-10,3,3)
2
>>>pow(-10,3,-3)
-1
余数与mod同号,与pow(base,exp)的符号无关。
exp是负整数,这时base不能被mod整除,算法与是正整数不一样。它寻找一个绝对值最小的整数,使这个整数与底的|exp|幂的乘积,如果mod<0则这个积还要加上|mod|,再取|mod|的余数是1。另一种说法,它寻找一个绝对值最小的整数,使这个整数与底的|exp|幂的乘积取|mod|的余数,如果余数小于0,该余数加|mod|,结果等于1 。
>>>pow(10,-2,3)
1
>>>1*10**2%3 == 1
True
>>>pow(10,-2,-3)
-2
>>>(-2*10**2+3)%3 == 1
True
>>>a=-2*10**2%3
>>>a = a+3 if a<0 else a
>>>a == 1
True
>>>pow(-10,-3,-3)
-1
>>>(-1*(-10)**3+3)%3 == 1
True
>>>a=-1*(-10)**3%3
>>>a = a+3 if a<0 else a
>>>a == 1
True
例1 阿基米德从古希腊的最大数字单位“万”开始,引进新数“万万(亿)”作为第二阶单位,然后是“亿亿”(第三阶单位),“亿亿亿”(第四阶单位),等等,每阶单位都是它前一阶单位的1亿倍。编程计算阿基米第八阶单位1后面有多少个0?
程序代码(文本代码附录1):
运行结果:
练习题
1、填写下面的运行结果(问号处),然后拷贝运行验证。
>>>pow(5,3)
?
>>>pow(-5,3)
?
>>>pow(-5,0)
?
>>>pow(5.0,3.0)
?
>>>from fractions import Fraction
>>>pow(Fraction(2,3), 2)
?
>>>pow(Fraction(2,3), -2)
?
>>>pow(Fraction(5,2), 2.0)
?
2、填写下面的运行结果(问号处),然后拷贝运行验证。
>>>pow(2021,2022,3)
?
>>>pow(2022,2022,-10)
?
>>>pow(-2022,2023,5)
?
>>>pow(-112,111,-3)
?
3、求一个数,使它与38的积除以97的余数是1。
4、用2,3,4三个数字组成最大的数是多少?
附录1:
#阿基米德八阶单位
j1=10000
print("第1阶单位:",j1)
j2=pow(j1,2)
print("第2阶单位:",j2)
for i in range(3,9):
j = pow(j2,i-1)
print("第%d阶单位:%d" % (i, j))