我想确定一个阶乘的最后一个非零数字。
我尝试使用除法来解决它:将数字除以10或其倍数。
Ex : 7! = 5040 => 4
所以我将5040除以10并得到4作为结果。
但是,让我们说,我们应该使用逻辑中的数字7而不是阶乘的值(5040)。
请让我知道我该怎么做?
答案 0 :(得分:13)
p
< = n
,p的指数为
5
的指数中减去2
的指数,并丢弃素数分解中的所有五个。我用了一些空余时间在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