n = 12345678901234567891
求:n ** n 的十进制数值的后20位数字
十进制乘法进位是从低向高,因此只需要计算底数的后20位即可,对于指数n,若是偶数,则a^n = (a^(n/2))^2,若是奇数,则a^n = a^(n-1)*a。反复迭代,即可求得结果。验证代码如下:
>>> def f(n):
fact = int(str(n)[-20:])
s = 1
while n > 2:
if n%2:
n -= 1
s *= fact
s = int(str(s)[-20:])
else:
n //= 2
fact *= fact
fact = int(str(fact)[-20:])
s *= fact**2
return str(s)[-20:]
>>> n = 12345678901234567891
>>> f(n)
'38565306203464524491'
n = 12345678901234567891
print((n**n)[:-21])
n = 123456789123456789 print(str(n**n)[-10:])
def pow(x, n):
x_init = x
bin = []
while n > 0:
r = n % 2
bin.insert(0, r)
n = n // 2
for idx in range(1, len(bin)):
x = x * x
if bin[idx] == 1:
x = x * x_init
return x
大数 = pow(12345678901234567891, 12345678901234567891)
print(str(大数)[-20:])
大数转整数 = int(str(大数)[-20:])
print(大数转整数)
主动删除,不想对牛弹琴
我这里没有写代码,不过我有一个小的想法,因为我们直接使用n**n的话,会直接超出长度,而如果转化成字符串的形式的话,我们又不能直接进行计算,所以我的想法是,不管怎么算,我们先将n/10^10,转换成小数的形式,再通过将结果向’神仙别闹‘答主那样子转换出来,假如说我们会有不足20位将前面的0给去掉是否可行呢。(备注:如果不可行,大佬勿喷,一个今年刚毕业萌新就事论事输出自己的小想法。)
n = 12345678901234567891
n = str(n)
print(n[20:len(n)])
如果你需要计算的话,修改为
n = 123 ** 456
n = str(n)
print(n[20:len(n)])