Python 内建pow()函数与math.pow()函数区别

一道非常简单的练习题:

给定n,计算:1^8 + 2^8 +3^8 +4^8 + ... + n^8,结果取模 2020

第一时间想到的就是math.pow(), 上来就是:

def cal01(x, y, z):
    return sum(map(lambda i: math.pow(i + 1, y) % z, range(x)))

对于x = 1234, y = 8, z = 2020有输出:

1231673.0

一看测试用例,结果对不上,蒙了

后面尝试用内建的pow:

def cal02(x, y, z):
    return sum(map(lambda i: pow(i + 1, y) % z, range(x)))

对于x = 1234, y = 8, z = 2020有输出:

1147613

这次没毛病,后来发现math.pow()函数会把参数转换为 float,而内建的pow()把参数直接作为整型,
对于输入x = 12, y = 8, z = 2020,上面两个函数的输出分别是:

9690.0
9690

也就是数值小的时候还行,后面x太大了就会导致累计偏差很大

此外内建的pow()可以有三个参数:pow(x, y[, z]),z表示对结果进行取模

所以代码改为:

def cal(x, y, z):
    return sum(map(lambda i: pow(i + 1, y, z), range(x)))

基础不牢地动山摇.png