求1000的阶乘



------
如何算出1000的阶乘
------
你要这么大的数有什么用?

PS:你要精确的,还是大概的?
------
for循环么
------
for(int i=1000;i>0;i--)
{
int j=1;
j*=i;
}

// 不要忘记给分 嘿嘿~
------
for(int i=1000;i>0;i--)
{
long j=1;
j*=i;
}

// 不要忘记给分 嘿嘿~
------
楼上太可爱了,嘿嘿~
------
引用 5 楼 bao110908 的回复:
楼上太可爱了,嘿嘿~

------
学习中
------
用斯特林公式计算的话,最大的 int 数的阶乘是

2147483647! = 1.128460650183488 * 10^19107526488
------
提供两种算法吧,都不是精确的

1,斯特林公式,算法复杂度 O(1):

n! ≈ sqrt(2 * pi * n) * pow(n / e, n)

pi 是圆周率;e 是自然对数的底


2,将乘法化为加法的公式,算法复杂度 O(N):

  n! = 1 * 2 * 3 * ... * (n - 1) * n
log(n!) = log(1) + log(2) + log(3) + ... + log(n - 1) + log(n)
  n! = 10^(log(1) + log(2) + log(3) + ... + log(n - 1) + log(n))

------
楼上都是错的,人家要得是1000的阶乘,可不是大概的值,
是小学信息学奥林匹克的高精度计算题吧.
------
学习
------
for循环 递归都可以
------
微软的一个面试题是1000的阶乘有多少位,用对数计算大家都知道是2568哈,
那么开一个2568位的数组,循环求阶乘,对数组里的数超过10就进位;
或者超过256进位,65536进位都是一样的.最后从数组最高位输出就行了.
------
引用 14 楼 runffer_yang 的回复:
楼上都是错的,人家要得是1000的阶乘,可不是大概的值,
是小学信息学奥林匹克的高精度计算题吧.

------
引用 18 楼 runffer_yang 的回复:
微软的一个面试题是1000的阶乘有多少位,用对数计算大家都知道是2568哈,
那么开一个2568位的数组,循环求阶乘,对数组里的数超过10就进位;
或者超过256进位,65536进位都是一样的.最后从数组最高位输出就行了.

------
引用 19 楼 bao110908 的回复:
我不知道需要这 2568 位精确数字的数有什么用处!

精确的阶乘计算并没有什么公式可言,只能一个一个的乘。我认为这种题还不如问 1000 的阶乘有几位数字还来得有意义。

------
1000的阶层太大

解决办法是 把每次得到的值放到 数组里面,然后再两个数组相乘得到新的数组,这样才不会出现越界异常。

数组相乘的算法就要自己写了。

每次传递两个数组返回新的数组,然后用递归。


------
这个求出来是大数,就算是double类型也放不下
好像 求出来 放到数组里面,具体怎么实现……

观望中…………
------
引用 22 楼 kokobox 的回复:
1000的阶层太大

解决办法是 把每次得到的值放到 数组里面,然后再两个数组相乘得到新的数组,这样才不会出现越界异常。

数组相乘的算法就要自己写了。

每次传递两个数组返回新的数组,然后用递归。

------
一个循环,一个数组就可以了啊

很好,很强大!
------
引用 24 楼 runffer_yang 的回复:
用的上这么复杂吗?一个数组一个循环足以.
比如我计算5的阶乘,先求5!的位数为3
数组初始值为{0,0,1}
x2: {0,0,2}
x3: {0,0,6}
x4: {0,0,24} 进位=> {0,2,4}
x5: {0,10,20} 进位=> {0,12,0} 进位=> {1,2,0}
最后输出120

------
不好意思 忘记考虑数位大小了 应该用大整数来做而不是long。。。
------
应该是用数组进位吧,像珠算那样!
------
引用 24 楼 runffer_yang 的回复:
引用 22 楼 kokobox 的回复:
1000的阶层太大

解决办法是 把每次得到的值放到 数组里面,然后再两个数组相乘得到新的数组,这样才不会出现越界异常。

数组相乘的算法就要自己写了。

每次传递两个数组返回新的数组,然后用递归。

用的上这么复杂吗?一个数组一个循环足以.
比如我计算5的阶乘,先求5!的位数为3
数组初始值为{0,0,1}
x2: {0,0,2}
x3: {0,0,6}
x4: {0,0,24} 进位=> {0,2,4}
x5: {0,10,20…

------
引用 23 楼 sunzerui 的回复:
这个求出来是大数,就算是double类型也放不下
好像 求出来 放到数组里面,具体怎么实现……

观望中…………

------
引用 30 楼 kokobox 的回复:
一个数组一个循环???? 你求的阶层的位数如何得到? 如果不是1000,我10000的话,位数是多少? 所求结果不放到数组中? 这就两个了吧。。。。。
利用大学教材中的矩阵算法

------
引用 32 楼 runffer_yang 的回复:
引用 30 楼 kokobox 的回复:
一个数组一个循环???? 你求的阶层的位数如何得到? 如果不是1000,我10000的话,位数是多少? 所求结果不放到数组中? 这就两个了吧。。。。。
利用大学教材中的矩阵算法

Ok,一个循环不够, 两个足够了,时间复杂度O(n^2)
矩阵?不知道你哪个大学的,被乘数1000,用不着矩阵.

------
引用 32 楼 runffer_yang 的回复:
引用 30 楼 kokobox 的回复:
一个数组一个循环???? 你求的阶层的位数如何得到? 如果不是1000,我10000的话,位数是多少? 所求结果不放到数组中? 这就两个了吧。。。。。
利用大学教材中的矩阵算法

Ok,一个循环不够, 两个足够了,时间复杂度O(n^2)
矩阵?不知道你哪个大学的,被乘数1000,用不着矩阵.

------
引用 34 楼 kokobox 的回复:
引用 32 楼 runffer_yang 的回复:
引用 30 楼 kokobox 的回复:
一个数组一个循环????  你求的阶层的位数如何得到? 如果不是1000,我10000的话,位数是多少? 所求结果不放到数组中? 这就两个了吧。。。。。
利用大学教材中的矩阵算法

Ok,一个循环不够, 两个足够了,时间复杂度O(n^2)
矩阵?不知道你哪个大学的,被乘数1000,用不着矩阵.


断章取义啊????????  有意思吗?

------
引用 35 楼 runffer_yang 的回复:
引用 34 楼 kokobox 的回复:
引用 32 楼 runffer_yang 的回复:
引用 30 楼 kokobox 的回复:
一个数组一个循环???? 你求的阶层的位数如何得到? 如果不是1000,我10000的话,位数是多少? 所求结果不放到数组中? 这就两个了吧。。。。。
利用大学教材中的矩阵算法

Ok,一个循环不够, 两个足够了,时间复杂度O(n^2)
矩阵?不知道你哪个大学的,被乘数1000,用不着矩阵.


断章取义啊???????? 有意思吗?…

------
以前也有人提过这样的问题,但终无程序结果。

此贴收藏,并推荐,感谢 runffer_yang 给出的程序。


------
上面的算法可以优化,我是10进1,也可以256,65536进位,这样循环长度减少.
To kokobox:我说话可能尖刻点,别介意.
------
引用 40 楼 runffer_yang 的回复:
上面的算法可以优化,我是10进1,也可以256,65536进位,这样循环长度减少.
To kokobox:我说话可能尖刻点,别介意.

------
你要那么大的数字干嘛?
------
确实大得惊人~~!
------
学艺
------
学习了,好像要用数组保存数字吧

------
http://topic.csdn.net/u/20081107/12/bbe2be15-2a95-48ef-80db-21cd756ee7c9.html?2095168368

这个里面有代码,是别人写的,C++的,不过转成JAVA也比较简单.
------
学习学习,收藏了,谢谢大家!!!
------
学习学习,收藏了,谢谢大家!!!
------
引用 46 楼 groovy2007 的回复:
不是有BigInteger吗,只要内存够用,再大的数也能算


------
对,只能用数组计算
------
学习了,收藏
------
过来学习的。
------
过来学习的。
------
鄙视二楼三楼,很基础的高精度算法。
------
见识了
------
小学信息学奥林匹克的高精度计算题???????
------
学习了,学习了。
------
up
------
来学习了!
的确不是那么简单的for语言或着long就可以了。
------
def fact(n)
  if n == 1
1
  else
n * fact(n-1)
  end
end

print fact(1000)
------
Windows用户下载Python,Python是一种脚本语言,可进行任意精度的数学计算 
http://www.activestate.com/Products/ActivePython/ 
以下为Python源码,用TAB或空格替换~ 
#!/usr/bin/python 
def foo(a) 
~ans = 1 
~for i in range(1, a+1): 
~~ans*=i 
~return ans 

print foo(1000)
------
学习~~
------
学习了
------
longint 够的吧
------
上次是100,这次换1000了.
这个数的确够大的.
------
江山代有人才出,各领风骚数几年。
  太强了!!!
收藏了!!
------
这个程序结果可不可以放到一个十六进制数的数组或栈中,然后输出
就没有那个2568那么大了吧???
只是一种思路,高手帮忙实现一下??
------
先定义一个数组来存放结果,使它就像是一个数字一样,每次满足10就向前进一位。
然后用for循环来执行,存放结果到那个数组中去。。。
------
java 代码
long j=1;
for(int i=1000;i>0;i--) 

  j*=i; 


c语言 代码

long j=1;
for(int i=1000;i>0;i--) 

  j*=i; 


web代码

<script language="javascripte">
var i,j=1;
 function a(i,j)
{
while(i<1000)
j*=i;

}
</script>

在<body>

调用 a()
</body>
------
[color=#FF6600][/color]你们太可爱了,赫尔
------
引用 50 楼 runffer_yang 的回复:
引用 46 楼 groovy2007 的回复:
不是有BigInteger吗,只要内存够用,再大的数也能算


如果你去微软或者谷歌面试,那么很遗憾,面试官不会让你用BigInteger或者BitDecimal,
事实上这个题目不是考用什么类型,而是考高精度计算的算法+数据结构.

------
由于 int 类型数据长度的限制,采用每位数字与乘数相乘的做法我认为并不好,
也就是说使用该方法做出的阶乘计算受到 int 类型最大数字的限制,并不能称
为大数计算。

所谓的大数计算不管是 200 亿的阶乘还是 2 的阶乘在计算上除了内存空间的限
制之外,不应受到编程语言数值类型最大数的限制。
------
牛淫
------
#include<stdio.h> 
#define N 1000 //要算的阶乘数 N!
long s[N]={1,1},n=N,t=2,a=1,b=0; 
int main()

  for(; a <= *s || (++t <= n ? (b = 0, a = 1) : 0); (*s == a++ && b) ? (*s)++ : 0) 
  s[a]=(b+=s[a]*t)%10000,b/=10000; 
  for(printf("%d",s[*s]);--*s>0;)
printf("%04d",s[*s]); 
printf("\n");
  return 0; 



这是一个北大大二的女生写的,我看不懂。可以很快求出N的阶乘!
------
可以运用指针或文本来输出,自己去学吧,其实不难!
------
给你一个关于求PI的任意高阶精度值得算法,你看看里面的方法!
#include <iostream>
#include <fstream>
#include <ctime>
#include "windows.h"
using namespace std;

void arctg(int * arctgx, int x, int len)
{
int n = 1, s = 1,c = 4,d = 0;
int i, *t, *a, eps = 0;
t = new int[len+1];
a = new int[len+1];
for(i=0;i<len;i++)
{
t[i] = c / x;
d = c % x;
c = d*10;
}
while(eps<len-1)
{
d = 0;
for(i=0;i<len;i++)
{
c = t[i]+d*10;
a[i] = c / n;
d = c % n;
}
for(i=1;i<len;i++)
{
if (a[i])
{
eps = i;
break;
}
else eps++;
}
if(s==1)
{
for(i=len-1;i>0;i--)
{
c = arctgx[i] + a[i];
arctgx[i] = c%10;
arctgx[i-1]+= c/10;
}
}
else
{
for(i=len-1;i>0;i--)
{

arctgx[i]-=a[i];
if (arctgx[i]<0)
{
arctgx[i] += 10;
arctgx[i-1]-=1;
}
}
}
n = n+2;
s = -s;
d = 0;
for(i=0;i<len;i++)
{
c = t[i]+d*10;
t[i] = c / x;
d = c % x;
}
d = 0;
for(i=0;i<len;i++)
{
c = t[i]+d*10;
t[i] = c / x;
d = c % x;
}
}
delete []t;
delete []a;
}


int main()
{
DWORD dwStart,dwStop; //调用系统功能来计时
dwStart=GetTickCount(); //开始计时
int c, d, len;
int decimal, *arctg5, *arctg239, *pi;
cout << "请输入所要计算的π的精度值:";
cin >> decimal;
len = decimal+10;
arctg5 = new int[len+1], arctg239 = new int[len+1], pi = new int[len+1];
cout << "计算进行中,请稍等……" << endl;
for(int i=0;i<len;i++)
{
arctg5[i] = 0;
arctg239[i] = 0;
}
arctg(arctg5, 5, len);
arctg(arctg239, 239, len);
d = 0;
for(i=len-1;i>=0;i--)
{
c = arctg5[i]*4 + d;
pi[i] = c % 10;
d = c / 10;
}
delete []arctg5;
for(i=len-1;i>0;i--)
{
pi[i]-=arctg239[i];
if (pi[i]<0)
{
pi[i] += 10;
pi[i-1]-=1;
}
}
delete []arctg239;
cout<< "π= " << pi[0] << '.';
  for(i=1;i<=decimal;i++)
{
cout<<pi[i];
}
delete []pi;
dwStop=GetTickCount(); //计时结束
cout<<endl;
cout<<"计算用时:"<<(double)(dwStop-dwStart)/1000<<"秒"<<endl;
return 0;
}

------
for循环啊!
不过要注意数据的类型!
double int 可能可以
------
引用 10 楼 SimonYeung 的回复:
LS的算法是对的 但是Long根本装不下1000的阶乘,这个数实在太大了

以至于自然界里都找不到与之配对的相关事物 这个数字对人类来说完全没有意义的。

如果计算小数量级的阶乘还是用递归吧。


Java code
public class FabPlus {
public static long fabPlus(long index) {
if(index == 1)
return 1;
else {
return index * fabPlus(index - 1);


------
我不建议用递归,本来就这么大,一辈子都输出不完,用递归没那么大内存。
我建议用普通方式运算,将结果放到链表里,注意进位,插入元素。
在汇编当中就是这样实现存放大数的,方式很简单,就是麻烦。
------
up

------
留个脚印 收藏
------
学习
------
老大,1000!和2的64次方哪个大,都溢出了计算机会给出正确答案吗?
------
这个问题的意义不应该是答案是多少吧……
------
引用 73 楼 groovy2007 的回复:
看清楼主的题目
“发表于:2009-04-11 19:50:20 楼主
如何算出1000的阶乘”
你那只眼睛看到说不准用BigInteger了?
别以为只有你自己会用数…

------
从中受益了~
学习~!
------
参考
------
都有没有数学头脑,这个结果恐怕就其位数都要超出 long 吧,讨论这么大的数字有意义吗?



------
夫妇
------
8楼的方法真不错,学习了。以前虽然见过,但是并没有留意,BigDecimal类的功能真是太强大了。
------
一个内存单元存放8个字节。我们把想要存储的内容按字节存放在内存中。输出时输出连续的内容。
同样道理,我们也可以把一个long型规定的长度作为一个假定的内存单元,将结果放在一个数组中。
然后按顺序输出数组。
------
学习,长见识了
------
啊 学习了
------
perl里搞定吧,加载BIGINT模块
------
for(int i=0;i<=1000;i++)
{
int sum=i++;
i=sum*i;
}
System.out.print(i);
------
楼上的程序写的不错,
------
看看 学习 呵呵
桂ICP备07017180号