求十进制数值的后20位数字

问题

n = 12345678901234567891
求:n ** n 的十进制数值的后20位数字

请勿使用pow函数或第三方库
请附上验证后的相关代码和结果
请勿粘贴代码截图

十进制乘法进位是从低向高,因此只需要计算底数的后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:])

https://ask.csdn.net/questions/7739415?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1-7739415-ask-7778702.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-1-7739415-ask-7778702.pc_feed_download_top3ask


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)])