计算阶乘的最后一个非零数字 - 为什么我的代码通过了一些测试但没有通过其他测试?

calculating the last non-zero digit of a factorial- why does my code pass some tests but fail others?

我正在编写代码来解决以下 codewars 问题:https://www.codewars.com/kata/5f79b90c5acfd3003364a337/train/python

我的想法是取 1 to n 中的所有整数,取每个整数的最后一位(第 0 栏),将它们相乘,然后 return 'last' 结果的非零位:

def last_digit(n):
    factorials = []
    factorials_n = 1
    for i in range(1,n + 1):
        i = str(i)
        i = i[::-1]
        for j in i:
            if j == "0":
                break
            factorials.append(j)
            break              


    # at this point factorials contains the first non-zero integers of each integer in reverse
    for i in factorials:
        factorials_n = factorials_n * int(i)

    factorials_n = str(factorials_n)
    factorials_n = factorials_n[::-1]


    for i in factorials_n:
        if i != "0":
            return int(i)

该代码通过了多项测试,但 387 (returns 6, should be 2)1673 (returns 2 should be 4) 未通过。我试过将打印语句作为调试,但代码看起来不错,也许是逻辑在某些时候失败了——有什么想法吗?

您的代码通过了直到 24 的数字测试用例,当 25 中的非零数字时失败!给出了一个错误的答案,它被传播到它后面的数字。

我们也可以简单地使用模运算符来获取最后一位数字,而不是将其转换为字符串
示例:1234 % 10 等于 4(这是最后一位)

我的解决方案:

def last_digit(n):

    factorial = 1
    
    for i in range(1, n + 1):
    
        # compute the factorial
        prod = factorial * i
        
        # keep dividing the product by 10 until the last digit is a !0 digit
        while prod % 10 == 0:
            prod = prod // 10
            
        # only store the last 3 digits of the computed product.
        # You can keep more digits to get accurate results for
        # when the numbers are higher than 10000
        factorial = prod % 1000
    
    # return the last digit
    return factorial % 10

正如我之前所说,当最后一个 !0 数字来自 24! (6) 乘以 25,它输出 150,在删除 0 后得到 5,但它应该是 4。因此,为了解决这个问题,我们至少保留最后 3 位数字,而不是仅保留最后一位数字.

Example:   6 * 25 =   150 => 5 (last !0 digit)
         936 * 25 = 23400 => 4 (last !0 digit)

PS: !0 = 非零

这里的问题出在逻辑上。由于您放弃了数字以 0 结尾的所有情况,因此我们无法得出正确答案。

考虑 2 x 8 x 30。要获得阶乘的最后一位,将最后一位相乘就足够了,但要找到最后一位非零数字,您必须计算 2 x 8 x 3 相反。

使用 this 解决方案作为参考,您可以执行以下操作:

def last_digit(n):
    # factorials = []
    # factorials_n = 1
    last = 1
    d2 = 0
    for i in range(1,n + 1):
       
        ii = i
        print(ii)
        while(ii%2==0):
            d2 +=1
            ii = ii/2
        
        while(ii%5==0):
            d2 -=1
            ii = ii/5
        print(d2)
        last = (last * ii)%10
        print(last)
    
    for i in range(0,d2):
        last = (last *2)%10

    return int(last)