阶乘计算和空间

atlight 2009-03-06 06:07:02
假如要求算 10000!
如果用计算机的空间来存放结果 可以用 2^N 来表达
N即为需要的位数 N / 8 即为字节数
那么 10000! 需要多少个字节?
...全文
591 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlssy204 2010-06-01
  • 打赏
  • 举报
回复
正确的0个数应该是

2111个
绿色夹克衫 2009-05-08
  • 打赏
  • 举报
回复
算0的话,Log(n)应该可以了

value = 10000;
count = 0;

while(value != 0)
{
value /= 5;
count += value;
}

如果只是估算一个大概的值,也许还有O(1)的方法,直接用10000/4,再调整一下,应该就可以了!

[Quote=引用 16 楼 matrixcl 的回复:]
引用 15 楼 WizardOz 的回复:
引用 10 楼 wangdechun99611 的回复:
我能计算出末尾有多少个零。

你牛,那你给我讲讲计算末尾0的方法?


只有分解质因数后,每出现一个2和一个5,末尾多一个0.

而5的个数肯定比2的个数少(很容易证明)

因此只要计算1——10000中“5”的个数。例如5:1个,10:1个,15:1个,20:1个,25:2个.....既可以得到0的个数了。

想了解详情,搜索关键字“编程之美 阶乘”
[/Quote]
matrixcl 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 WizardOz 的回复:]
引用 10 楼 wangdechun99611 的回复:
我能计算出末尾有多少个零。

你牛,那你给我讲讲计算末尾0的方法?
[/Quote]

只有分解质因数后,每出现一个2和一个5,末尾多一个0.

而5的个数肯定比2的个数少(很容易证明)

因此只要计算1——10000中“5”的个数。例如5:1个,10:1个,15:1个,20:1个,25:2个.....既可以得到0的个数了。

想了解详情,搜索关键字“编程之美 阶乘”
WizardOz 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangdechun99611 的回复:]
我能计算出末尾有多少个零。
[/Quote]
你牛,那你给我讲讲计算末尾0的方法?
yxysdcl 2009-05-03
  • 打赏
  • 举报
回复
就是一个stirling公式阿:
n! ~ sqrt(2*pi*n)*(n/e)^n (这里的^表示指数)
那么长度直接log10就行了
marsara 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 michel921 的回复:]
这个阶乘求起来电脑不冒烟就是好的
[/Quote]
呵呵,一般的电脑有得要算算了,super computer话不知道如何呵?
michel921 2009-04-29
  • 打赏
  • 举报
回复
这个阶乘求起来电脑不冒烟就是好的
chuengchuenghq 2009-04-29
  • 打赏
  • 举报
回复
up
wangdechun99611 2009-04-25
  • 打赏
  • 举报
回复
我能计算出末尾有多少个零。
boxer_tony 2009-04-25
  • 打赏
  • 举报
回复
6楼计算结果是错误的。10000!的前几位为:2846259680
wenzheng38 2009-04-25
  • 打赏
  • 举报
回复
10000!=1*2*3*....*9999*10000
log(10000!)=log(1)+log(2)+log(3)+....+log(9999)+log(10000)
10000!=10^[log(1)+log(2)+log(3)+....+log(9999)+log(10000)]就可估算出10000!有多少位了
soon 2009-04-24
  • 打赏
  • 举报
回复
10000!,看看楼主的内存怎么样了,反正要是用递归的,内存消耗大得我们不敢去想.我也,应该还没有算出来就死机了.
_千鸟 2009-04-14
  • 打赏
  • 举报
回复
10000!,你的double早就超啦。
luckyLHY 2009-04-14
  • 打赏
  • 举报
回复
10000! 的阶乘,没有任何一种数据类型能存放得下。要拆成数组存放。
下面是我用VB2005写的算法代码。用来计算阶乘的,即使是10000的阶
乘也就3秒算出。
至于要多少存储字节你就自己算了
Dim int_factorial As Integer = TextBox1.Text '阶乘数
Dim a_array(30000) As Integer '存储阶乘数值数组
Dim a_int As Integer '数组下标
Dim int_for As Integer '阶乘数
Dim a_carry As Integer '进位数值
Dim a_remainder As Integer '余数
For a_int = 0 To 2999 '初始化数组
a_array(a_int) = 0
Next
For int_for = 0 To int_factorial '算法循环次数
a_carry = 0
If int_for = 0 Then '如果阶乘数为0,则 a_array(0)=1
a_array(0) = 1
Else
For a_int = 0 To 2999 '阶乘数不为0,则阶乘数分别乘以数组每一个元素
a_remainder = (a_array(a_int) * int_for + a_carry) Mod 10 '除以10取余数
a_carry = (a_array(a_int) * int_for + a_carry) \ 10 '除以10取进位数
a_array(a_int) = a_remainder '余数放回本元素,作为新值,进位数进位下一个元素
Next
End If
Next
For a_int = 2999 To 0 Step -1 '把前面所有为0的元素去掉
If a_array(a_int) <> 0 Then
Exit For
End If
Next
Dim str As String = "" '由于数值太大,没有任何数据类型能存放,所以作为字符串存放
While a_int >= 0
str = str & a_array(a_int)
a_int = a_int - 1
End While
TextBox2.Text = str '输出数值
10000 阶乘的结果:
94486423838429890039982611332246896334652210
4692545137969276009719645338955332105584
24564018744861105095911176682894271164005401
0503770420346052521318228045892998637903
57235066510878235004334994239128523630889651
0989246641056331584171142885304143772286
62983231897086903040030132595147677423751615
8840915838059151673504519131178193943428
48292227230406142258207802782914807042676162
9302539228321084917759984200595105312164
73181840949313980044407284732590260916973099
8153853939031280878823902948001579008000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000000000000000000000000000
000000000000000000000000000000000000000000000
000000000000000
showjim 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 litaoye 的回复:]
我算过,当时用的是2^32进制,但实际用的是long保存的,总共3702个长整型,
每个8字节,总共不到30K吧!
[/Quote]
你那个结果是32位的长整形,不是64位的长整形,不会超过130000bits的

C#大整数计算源程序
http://www.showjim.com/source/cs/sys/dataStructure/bigInt.cs.txt
1851个长整数数,14808Bytes,118459bits
spirit_sheng 2009-03-07
  • 打赏
  • 举报
回复


#include <stdlib.h>
#include <math.h>

int CalcN(int n)
{
double tmp = 0;
for (int i=1; i<=n; i++)
tmp += log((double)i);
return (int)floor(tmp / log(2.0)) + 1;
}



但你需要的字节数应当是 (N+7)/8 个字节

n=10000 时, N=118459, (N+7)/8=14808
wolflion 2009-03-07
  • 打赏
  • 举报
回复
找个科学计算器就可以啦。

10000! = x;

y = log2x;

z = y/8
绿色夹克衫 2009-03-07
  • 打赏
  • 举报
回复
我算过,当时用的是2^32进制,但实际用的是long保存的,总共3702个长整型,
每个8字节,总共不到30K吧!

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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