algorithm - 阶乘的最后一个非零数字

标签 algorithm math

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

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

Ex : 7! = 5040 => 4

所以我将 5040 除以 10 得到 4。

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

请告诉我该怎么做?

最佳答案

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

我利用一些业余时间在 bash 中实现了这个解决方案。 (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}
}

是的,最后一个是 hack。

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

关于algorithm - 阶乘的最后一个非零数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13195946/

相关文章:

algorithm - 用于计算社区(互连节点)到另一个点之间的距离的有效算法

performance - 是否可以根据图灵空间复杂度估算所需的 RAM?

math - 计算进度条的百分比填充

c++ - 将较小数组中的值缩放到较大数组中

python - 递归地对列表的元素求和

algorithm - 我什么时候需要使用二进制搜索而不是线性搜索?

php - 在不计算其他排列的情况下找到第 n 个排列

javascript - 根据对象,在平移对象时考虑旋转

java - 如何创建像电话一样的秒/毫秒计时器?

algorithm - 从 N 个数据包中选择 M,因此总和是 K 的最小倍数