原创:大数阶乘的讨论(1)
2007-07-23 20:26
197 查看
阶乘一般定义为n!=nx(n-1)x(n-2)...x2x1
用普通函数可以表示为
int fact(int n)
{
int r;
while(n!=1)
{
r*=n;
--n;
}
return r;
}
也可以用函数递归形式
int fact(int n)
{
if(n==0)
return 1;
else
return n*fact(n-1);
}
但是由于计算机本身的限制,在32位机上最多只支持到2^32-1约为13!这显然不能满足巨数阶乘的需求。
现有一法,相信很多人都能想到的:科学计数法
利用一个double存储数字部分,一个uint存储指数,比如:120=1.2x10^2
具体实现方法:
fact(int n)
{
unsigned int exponent=0;
double bottom;
int i;
while(1){
bottom=1;
exponent=0;
for(i=2;i<=n;i++)
{
bottom*=i;
while(bottom>=10)
{
bottom/=10;
exponent++;
}
}
if(exponent<=9)
{
for(i=1;i<=exponent;i++) bottom*=10;
printf("%d! = %.0lf/n",n,bottom); //若阶乘小于10位,就不用科学计数形式
}
else
printf("%d! = %lfe+%d/n",n,bottom,exponent); //以科学计数形式输出
}
}
在我的电脑上,计算100,000,000!(10亿)阶乘只需要16s左右的时间,应该说相当快了。
100,000,000!=1.617204e+756570556
用普通函数可以表示为
int fact(int n)
{
int r;
while(n!=1)
{
r*=n;
--n;
}
return r;
}
也可以用函数递归形式
int fact(int n)
{
if(n==0)
return 1;
else
return n*fact(n-1);
}
但是由于计算机本身的限制,在32位机上最多只支持到2^32-1约为13!这显然不能满足巨数阶乘的需求。
现有一法,相信很多人都能想到的:科学计数法
利用一个double存储数字部分,一个uint存储指数,比如:120=1.2x10^2
具体实现方法:
fact(int n)
{
unsigned int exponent=0;
double bottom;
int i;
while(1){
bottom=1;
exponent=0;
for(i=2;i<=n;i++)
{
bottom*=i;
while(bottom>=10)
{
bottom/=10;
exponent++;
}
}
if(exponent<=9)
{
for(i=1;i<=exponent;i++) bottom*=10;
printf("%d! = %.0lf/n",n,bottom); //若阶乘小于10位,就不用科学计数形式
}
else
printf("%d! = %lfe+%d/n",n,bottom,exponent); //以科学计数形式输出
}
}
在我的电脑上,计算100,000,000!(10亿)阶乘只需要16s左右的时间,应该说相当快了。
100,000,000!=1.617204e+756570556
相关文章推荐
- 原创:大数阶乘的讨论(2)
- 原创:大数阶乘的讨论(3)
- 原创:大数阶乘的讨论(4) (源码未实现)
- [原创]阶乘(1000的阶乘,10000的阶乘...)以及大数相乘(几十万位乘几十万位)
- 大一下期末考试:大数存储 阶乘50!
- 大数,高精度计算---大数阶乘
- [笔试面试题]求大数的阶乘(如1024的阶乘)
- 计算大数阶乘
- NYOJ 28 大数阶乘
- HDU1042 N! 大数阶乘 Java
- Java 小例子:大数乘法和阶乘
- Matlab 计算大数的阶乘
- 大数阶乘
- 算法爱好者——大数阶乘 ? 待解决
- asp利用数组实现阶乘计算(大数相乘)
- 【学习笔记】大数阶乘
- 大数阶乘的实现
- HDU 1042 N! (大数阶乘加优化处理)
- 每日一算法:大数的阶乘
- 大数据之大数阶乘