Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
123
返回列表 发新帖
楼主: legend_chen

出题:看看谁的代码最简单-求自然数的阶乘n!的结果末尾零的个数

[复制链接]
发表于 2008-1-20 14:23 | 显示全部楼层

<p>F = n * F(n - 1) 假如n=4</p><p><br/>F = 4*F(3)</p><p>F = 4*3*F(2)</p><p>F = 4*3*2*F(1)</p><p>F(1)=1</p><p>F=4*3*2*1</p>
回复

使用道具 举报

发表于 2008-1-20 14:25 | 显示全部楼层

<p>呵呵 楼上的这个例子是偶自己编的 可能不太恰当</p>
回复

使用道具 举报

发表于 2008-1-20 14:28 | 显示全部楼层

<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>Luckyguy2008</i>在2008-1-20 12:24:00的发言:</b><br/><p></p><p>多大的数都满足</p><p>Function 尾数(Num As Range) As Long<br/>&nbsp;&nbsp;&nbsp; Dim i As Long, j As Long<br/>&nbsp;&nbsp;&nbsp; j = Int(Log(Num) / Log(5))<br/>&nbsp;&nbsp;&nbsp; For i = 1 To j<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尾数 = 尾数 + Int(Num / 5 ^ i)<br/>&nbsp;&nbsp;&nbsp; Next<br/>End Function</p></div><p>这个厉害</p>
回复

使用道具 举报

发表于 2008-1-20 14:31 | 显示全部楼层

FACT就是求阶,不是介吧?!

Function jxlgf(n As Integer) As Integer<br/>Dim jxn, jnr, k As Integer<br/>jxn = Application.Fact(n)<br/>jxr = jxn<br/>Do<br/>jxr = Int(jxr / 10)<br/>jxn = jxn / 10<br/>k = k + 1<br/>Loop Until jxn &lt;&gt; jxr<br/>jxlgf = k - 1<br/>End Function<br/>
回复

使用道具 举报

发表于 2008-1-21 21:15 | 显示全部楼层

<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>xhsdham</i>在2008-1-20 14:16:00的发言:</b><br/><p>教程上是这么说的 假如n=4</p><p>F =&nbsp;4 * F(4 - 1) 调用f(3)<br/></p><p>F =&nbsp;3 * F(2 - 1) 调用f(2)</p><p>F =&nbsp;2 * F(2 - 1) 调用f(1)</p><p>F(1)=1 开始返回</p><p>2*1 得到2</p><p>3*2 6</p><p>4*6 24</p><p>答案 24</p><p><br/></p><p><br/></p></div><p></p>什么教程,也给我们看看吧!
回复

使用道具 举报

 楼主| 发表于 2008-1-28 05:24 | 显示全部楼层

<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>liyh67</i>在2008-1-20 12:50:00的发言:</b><br/>Function weishu(num As Range) As Long<br/>i = 5<br/>While i &lt;= num<br/>weishu = weishu + Int(num / i)<br/>i&nbsp;= i * 5<br/>Wend<br/>End Function<br/></div><div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>Luckyguy2008</i>在2008-1-20 12:24:00的发言:</b><br/><p></p><p>多大的数都满足</p><p>Function 尾数(Num As Range) As Long<br/>&nbsp;&nbsp;&nbsp; Dim i As Long, j As Long<br/>&nbsp;&nbsp;&nbsp; j = Int(Log(Num) / Log(5))<br/>&nbsp;&nbsp;&nbsp; For i = 1 To j<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尾数 = 尾数 + Int(Num / 5 ^ i)<br/>&nbsp;&nbsp;&nbsp; Next<br/>End Function</p><p>&nbsp;</p></div>两个人的代码好像都很简单,而且在有效的数据范围内,用时我电脑都是分不出来的。那就并列第一了。每人10个bb吧。
回复

使用道具 举报

发表于 2014-2-15 19:49 | 显示全部楼层
本帖最后由 香川群子 于 2014-2-15 19:52 编辑
legend_chen 发表于 2008-1-28 05:24
QUOTE:以下是引用liyh67在2008-1-20 12:50:00的发言:Function weishu(num As Range) As Longi = 5While i  ...

呵呵,我才是第一啊。

用迭代计算,非常简单那。

  1. Function f(n)
  2.     Do
  3.         n = n \ 5: f = f + n
  4.     Loop While n > 4
  5. End Function
复制代码
原理也很简单,有一个5的因子,乘积就会有一个0
偶数x5=10,偶数管够不用计算,因此只要问含有多少5的因子就可以了。

回复

使用道具 举报

发表于 2014-2-15 20:23 | 显示全部楼层
本帖最后由 香川群子 于 2014-2-16 22:47 编辑
xhsdham 发表于 2008-1-20 14:09
刚刚学习了下"递归" 正好是这个问题(偶似懂非懂)Function F(ByVal n As Integer) As LongIf n = 1 ThenF = ...

刚才是迭代计算,现在再来一个递归计算的,也是我第一:
  1. Function f(n)
  2.     If n > 4 Then f = n \ 5 + f(n \ 5)
  3. End Function
复制代码
可能这样看更容易理解一些:
Function f(n)
    If n < 5 Then
        f = 0
    Else
        f = n \ 5 + f(n \ 5)
    End If
End Function


参考阶乘的递归函数是:
Function fact(n)
    If n = 1 Then
        fact = 1
    Else
        fact = n * fact(n - 1)
   End If
End Function



回复

使用道具 举报

发表于 2014-2-15 20:37 | 显示全部楼层
再给大家一个工作表数组公式:

显然又是我第一啊。
  1. =SUM(INT(A1/5^ROW(INDIRECT("1:"&INT(LOG(A1,5))))))
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2025-8-16 05:21 , Processed in 0.115893 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表