大整数阶乘C语言怎么计算?

思想思想..说下

C语言利用数组计算超大整数的阶乘代码
#include <stdio.h>
int main()
{
int n;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry; //carry:进位

printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1; //将结果先初始化为1

for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0; j<=digit; j++ )
{
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry / 10; //看还能不能进位
}
}
printf("n ! = "); //显示结果
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n");
return 0;
}

#include <stdio.h>
int main()
{
int n;
int a[9000]; //确保保存最终运算结果的数组足够大
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
int i, j, carry; //carry:进位

printf("please in put n:\n");
scanf("%d",&n);
a[0] = 1; //将结果先初始化为1

for ( i=2; i<=n; i++ ) //开始阶乘,阶乘元素从2开始依次"登场"
{ //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j=1, carry=0; j<=digit; j++ )
{
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry)
{ //如果有进位
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry = carry / 10; //看还能不能进位
}
}
printf("n ! = "); //显示结果
for(j = digit; j >=1;j--)
{
printf("%d",a[j-1]);
}
printf("\n");
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-25
大整数运算其实思路很简单,就是把数字按位处理,用计算机仿人手工计算的方法。举个例子,一般我们用整数加减乘除用int 类型,比如
int a = 100 * 200;
但是无论是长整型long还是短整型short,都是有限长度的,short相当于2个字节,long相当于4个字节,那么这个整数最大也就是0到0xffffffff了。

现在,我们用一个字符串代替整数,比如
char * a = "11111111111111111111111111111111111"; //这是个非常大的整数
假设有另一个整数
char * b = "22222222222222222222222222222222222"; //这是另一个大整数
那么我们做一下加法。记得小学算术怎么算加法吗?就是从最后一位开始,两两相加,如果结果超过十,则有进位

void add(char * a, char * b, char * c) // c = a+b
{
int upgraded = 0; //进位标志
size_t lc = MAXLEN; //这里假设所有字符串长度固定
for(size_t i = 0; i<lc; i++) { //注意这里假设最低位为char[0]
char cc_a = a[i] - '0'; //取得a对应位的值
char cc_b = b[i] - '0'; //取得b对应位的值
char cc_c = cc_a + cc_b + upgraded; // c[i] = a[i] + b[i] + 进位
if(cc_c >9) {
upgraded = 1;
cc_c %= 10;
}//end if
c[i] = cc_c + '0'; //转化为字符串
}//next i
...//处理最后一位进位
}

真正处理的时候,我建议用链表代替字符串
你可以自定义一个CLargeInt类,完成加减乘除基本操作后,再做阶乘本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网