3000的阶乘有多少个零?

sea_sky87 2010-10-12 12:25:37
3000的阶乘有多少个零?
...全文
1046 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
Devillyd 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vrhero 的回复:]
1550个...需要.Net 4.0支持...

C# code
System.Numerics.BigInteger Factorial(System.Numerics.BigInteger i)
{
System.Numerics.BigInteger result = 1;
while (true)
{
if (i < 2)
……
[/Quote]
同意一楼
hepo812 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 dongxinxi 的回复:]
。。。。。。
假设已知1001!的阶乘有多少个零,用这种方法算一下1003*1002*(1001!)算出来有多少个零呢?
明显不对吧..

这种问题无聊时想想法子还是可以的,真正面试的时候如果真的问起,1楼的方法还是很“高效”的,因为如果你第一次碰到这种问题,可能等你想出较好的算法,人家已经让你回去等消息了..
[/Quote]
你这么说相当于求1003!有多少个0,问题是这么求我根本不需要知道1001!有多少个0,用上面的方法就可以求出来
1003/ 5 = 200
200 / 5 = 40
40 / 5 = 8
8 / 5 = 1
200 + 40 + 8 + 1 = 249
所以1003!有249个0,这道题目我看过,小学六年级的奥数题目, 小学生可不会编程,人家出这道题目肯定就有巧的解法!
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 fcdesk 的回复:]
引用 21 楼 hepo812 的回复:

找出其中因数包含2和5的个数,有多少个5就有多少个0,因为2的个数肯定比5多,所以找5
1到3000中有一个因数包含5的数为 3000 /5 = 600
有两个因数包含5的数为 600 / 5 = 120
有三个因数包含5的数为 120 / 5 = 24
有四个因数包含5的数为 24 / 5 = 4
600 + 120 + 24 + 4 =……
[/Quote]

假设已知1001!的阶乘有多少个零,用这种方法算一下1003*1002*(1001!)算出来有多少个零呢?
明显不对吧..

这种问题无聊时想想法子还是可以的,真正面试的时候如果真的问起,1楼的方法还是很“高效”的,因为如果你第一次碰到这种问题,可能等你想出较好的算法,人家已经让你回去等消息了..
vrhero 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 hepo812 的回复:]
你这么说相当于求1003!有多少个0,问题是这么求我根本不需要知道1001!有多少个0,用上面的方法就可以求出来
1003/ 5 = 200
200 / 5 = 40
40 / 5 = 8
8 / 5 = 1
200 + 40 + 8 + 1 = 249
所以1003!有249个0,这道题目我看过,小学六年级的奥数题目, 小学生可不会编程,人家出这道题目肯定就有巧的解法![/Quote]
错了...1003!有448个零...都说了你们考虑的不完整,只考虑了尾随零...这题小学奥数的水平可玩不了...

ps:小学生会编程的倒不稀奇...
yilaozhuang 2010-10-13
  • 打赏
  • 举报
回复
方法这么多啊,看来同样的目的方法很多,高手和菜鸟的区别就在方法了
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 hepo812 的回复:]
引用 40 楼 dongxinxi 的回复:
。。。。。。
假设已知1001!的阶乘有多少个零,用这种方法算一下1003*1002*(1001!)算出来有多少个零呢?
明显不对吧..

这种问题无聊时想想法子还是可以的,真正面试的时候如果真的问起,1楼的方法还是很“高效”的,因为如果你第一次碰到这种问题,可能等你想出较好的算法,人家已经让你回去等消息了..

你这么说相当于求1003……
[/Quote]

我没看错的话,貌似题目没有说只求结尾的零个数吧..
既然在论坛里,自然是方法论的时候
但我说的是面试的时候,如果刚好又是第一次碰到这种问题,几乎是不太可能想出非常高效的算法的,但起码它能解决问题
q107770540 2010-10-12
  • 打赏
  • 举报
回复
尝试用LINQ写了一下
但是没找到一个合适的类型来存储结果:


int[] iii = Enumerable.Range(1, 3000).ToArray();
var query=iii.Aggregate((a, b) => a * b);
  • 打赏
  • 举报
回复
顶,1楼很强大啊
vrhero 2010-10-12
  • 打赏
  • 举报
回复
1550个...需要.Net 4.0支持...
System.Numerics.BigInteger Factorial(System.Numerics.BigInteger i)
{
System.Numerics.BigInteger result = 1;
while (true)
{
if (i < 2)
return result;

result *= i;
i--;
}
}
Console.WriteLine(Factorial(3000).ToString().Where(c => c == '0').Count());
太上老君 2010-10-12
  • 打赏
  • 举报
回复
感谢算法帝感谢数学帝感谢4.0,接分。
bourbon1795 2010-10-12
  • 打赏
  • 举报
回复
.net 4.0支持大数。
vrhero 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lianshaohua 的回复:]
引用 20 楼 hinada99 的回复:
顶顶顶 1楼强大的解决方法

是最笨的方法,有算法可以计算的,人家让你算有多少个零,没有让你求阶乘,就像问从1加到100的数字是多少,很多人会用循环来算,有这个必要吗?难道没有学公式嘛?
[/Quote]
笨是笨了点,但是是最直接最正确的,计算机就是用来干笨活的...

楼上有几位的思路是正解,但是算法都考虑的不完整,所以结果统统不对...至于正确的算法,我老了不愿意思考这种问题了...
qlf2008 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vrhero 的回复:]

1550个...需要.Net 4.0支持...
C# code
System.Numerics.BigInteger Factorial(System.Numerics.BigInteger i)
{
System.Numerics.BigInteger result = 1;
while (true)
{
if (i < 2)
……
[/Quote]
什么意思啊?谁给解释解释
完美算法 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 hepo812 的回复:]

找出其中因数包含2和5的个数,有多少个5就有多少个0,因为2的个数肯定比5多,所以找5
1到3000中有一个因数包含5的数为 3000 /5 = 600
有两个因数包含5的数为 600 / 5 = 120
有三个因数包含5的数为 120 / 5 = 24
有四个因数包含5的数为 24 / 5 = 4
600 + 120 + 24 + 4 = 748
所以有748个0,不知道对不对
[/Quote]
正解
yqw2222 2010-10-12
  • 打赏
  • 举报
回复
引用 31 楼 netmaster203 的回复:
这么强大啊,呵呵,测试测试哈


小心搞崩机了
ruanwei1987 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 netmaster203 的回复:]
这么强大啊,呵呵,测试测试哈
[/Quote]
upupup
netmaster203 2010-10-12
  • 打赏
  • 举报
回复
这么强大啊,呵呵,测试测试哈
name_xiyan 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 name_xiyan 的回复:]
使用js的计算 代码如下
<html>
<head>
<script type="text/javascript">
function jisuan(ct)
{
num=0;
for(i=1;i<ct;i++)
{

j=i;
while(j%5==0)
{
num++;
j=j/5;
}
}
alert(num);
}
</scr……
[/Quote]
748是对的 这个没有包括3000。
for(i=1;i<ct;i++)改为for(i=1;i<=ct;i++)
name_xiyan 2010-10-12
  • 打赏
  • 举报
回复
使用js的计算 代码如下
<html>
<head>
<script type="text/javascript">
function jisuan(ct)
{
num=0;
for(i=1;i<ct;i++)
{

j=i;
while(j%5==0)
{
num++;
j=j/5;
}
}
alert(num);
}
</script>
</head>
<body>
<script>
jisuan(3000);
</script>
</body>
</html>

结果是745
name_xiyan 2010-10-12
  • 打赏
  • 举报
回复
如果不是结尾有多少零的话只能强计算阶乘了。如果算结尾:
int num=0;
for(int i=0;i<3000;i++)
{
int j=i;
while(j%5==0)
{
num++;
j=j/5;
}
}
return numl;
加载更多回复(23)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧