分享一个能计算14 以上阶乘方法 给出学者的帮助
#include<stdio.h>#define Length 2000
int a[Length];
int ExitsNum()//判断有效位
{
int i,temp;
int k=0;//保存数值为0的数组长度值
for(i=Length;i>=0;i--)
{
if(a[i]==0)//遇到不为0的数组元素 时退出循环
k++;
else
break;
}
temp=Length-k;//取得实际长度值
return temp;
}
void LoadArray()//初始话数组
{
int i;
for(i=1;i<=Length;i++)//循环当前数组所有长度
{
a[Length]=0;//组全部初始化为0
}
}
void CatchNum(int p)//数组进位
{
int temp;//用于临时存储个位以上的数值
temp=a[p]/10;//将所得的2位以上的数值保存在temp中
p++;//向前进位
if(temp!=0)
{
a[p]=a[p]+a[p]%10;//进位数相加
CatchNum(p);//为2位以上 继续进位
}
else
a[p]=a[p]+temp;//将最后的结果放在p上 注意:p++
}
void multi(int k)//对传入的k做乘法
{
int i;
int q=0;//用于判断有效位
int l=0;//用于有效位数 (分别对数组每个元素做乘法)
for(i=1;i<=k;i++)
{
q=ExitsNum();//取得数组长度
for(l=0;l<=q;l++)//对数组每个元素做乘法
{
a[l]=a[l]*i;
if(a[l]>9)//判断第L次乘法是否需要进位(大于9进位)
{
CatchNum(l);//调用进位函数
}
}
}
}
void print()//对数组的数据进行 输出 注:此处为逆向输出
{
int i=0,j;//判断有效位
i=ExitsNum();//取得有效位
for(j=i;j>=0;j--)//逆向输出
{
printf("%d",a[j]);//输出最后数据
}
}
void main()
{
int n;
a[0]=1;//初始化第一个数 为1 (为什么? 因为零乘任何数都为零)
scanf("%d",&n);
LoadArray();//对数组初始化
multi(n);//计算
print();//打印出数据
}
----------------解决方案--------------------------------------------------------
注释好详细啊
谢谢楼主啦~~~~
----------------解决方案--------------------------------------------------------
以前问了那么多 现在就拿些容易的帮助初学者 应该的
----------------解决方案--------------------------------------------------------
谢谢楼主了,辛苦了.
----------------解决方案--------------------------------------------------------
不知道对不对,初始话数组里的a[length]应该是a[i]吧
----------------解决方案--------------------------------------------------------
好复杂,不过阶乘不是用递归比较好吗??
int main()
{
int i;
int b=0;
printf("请输入一个整数:\n");
scanf("%d",&i);
if(i<=0)
printf("只能输入正数");
b=fun(i);
printf("%d的阶乘是:%d",i,b);
system("PAUSE");
return 0;
}
int fun(int a)
{
if(a==1)return 1;
int s;
s=a*fun(a-1);
return s;
}
如果考虑到各种问题,数据类型应该用long,而且在某些地方添加判断会比较好的
[[italic] 本帖最后由 gaoyuanyao 于 2007-12-17 19:26 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
这是大阶乘,用别的方法很难办到.
----------------解决方案--------------------------------------------------------
...
对于进位那里的函数不太明白,楼主可以解释下吗?
void CatchNum(int p)//数组进位
{
int temp;//用于临时存储个位以上的数值
temp=a[p]/10;//将所得的2位以上的数值保存在temp中
p++;//向前进位
if(temp!=0)
{
a[p]=a[p]+a[p]%10;//进位数相加
CatchNum(p);//为2位以上 继续进位
}
else
a[p]=a[p]+temp;//将最后的结果放在p上 注意:p++
}
是什么意思呢?他要达到什么样的目的?
----------------解决方案--------------------------------------------------------
应该是a[i]才对~~~
----------------解决方案--------------------------------------------------------
回复 8# 的帖子
可以把乘出先看成是不是12345 这个函数的公能是把其数加到相应的数组位置上 ----------------解决方案--------------------------------------------------------