阶乘的最后一个非零数字

时间:2012-11-02 13:14:38

标签: algorithm math

我想确定一个阶乘的最后一个非零数字。

我尝试使用除法来解决它:将数字除以10或其倍数。

Ex : 7! = 5040 => 4

所以我将5040除以10并得到4作为结果。

但是,让我们说,我们应该使用逻辑中的数字7而不是阶乘的值(5040)。

请让我知道我该怎么做?

3 个答案:

答案 0 :(得分:13)

  1. 计算n的素数分解!如下:
    • 对于每个素数p< = n,p的指数为
  2. 5的指数中减去2的指数,并丢弃素数分解中的所有五个。
  3. 将剩余的素数分解模10乘以。注意,执行此操作时,可以使用以下等效项:(对于i≥0)。如有必要,个别产品也可以通过mod 10完成。

  4. 我用了一些空余时间在bash中实现这个解决方案。 (打击?好吧,为什么不呢?):

    last_nonzero () { 
        local n=$1
        local d=$(power_mod_10 3 $(count_factors $n 3))
        d=$((d * $(power_mod_10 2 $(($(count_factors $n 2)
                                   - $(count_factors $n 5))))))
        for p in $(primes 7 $n)
        do
            d=$((d * $(power_mod_10 $p $(count_factors $n $p)) % 10))
        done
        echo $d
    }
    
    count_factors () { 
        local n=$1 p=$2
        local d=$((n/p))
        local q=$d
        while ((q >= p)); do
            q=$((q/p)) d=$((d+q))
        done
        echo $d
    }
    
    power_mod_10 () { 
        local mods=..........0161000101012300070901490009010187000309
        local p=$(($1%10)) exp=$(($2%4+1))
        echo ${mods:$exp$p:1}
    }
    

    是的,最后一个是黑客。

    另外:有一个更好的递归解决方案。搜索http://math.stackexchange.com,甚至谷歌。

答案 1 :(得分:1)

当下一个(修改过的)数字以5结尾时,需要保持超过1个数字

第一个这样的位置来自15 !,当14! = 87178291200,而2 * 15 = 30但是 15! = 1307674368000。 而是12 * 15 = 180,这给出了正确的结果。

编辑:但是,即使将数字添加到两个也不足以满足25的通用情况!一个人需要3个24的最后数字! = 936得到正确的答案,这意味着最终这种方法不耐热。

答案 2 :(得分:1)

让我们说D(N)表示阶乘的最后一个非零数字,然后是

D(N)= 4 * D [N / 5] * D(N的单位数)[如果N的十位是奇数] D(N)= 6 * D [N / 5] * D(N的单位数)[如果N的十位是偶数];其中[N / 5]是最大的整数函数 和 D(1)= 1 D(2)= 2 D(3)= 6 D(4)= 4 D(5)= 2 D(6)= 2 D(7)= 4 D(8)= 2 D( 9)= 8

e.g。 D(26)= 6 * D [26/5] * D(6)= 6 * D(5)* D(6)= 6 * 2 * 2 = 4 [D(5)表示5的最后非零数字!= 120即2,D(6)相同] d(33)= 4 * d [5分之33] * d(3)= 4 * d(6)* d(3)= 4 * 2 * 6 = 8

参考:http://quantomania.blogspot.in/2011/08/last-non-zero-digit-of-factorial.html