大整数阶乘算法
时间:2010-09-30 来源:black_1890
#include "stdafx.h"
#include "stdlib.h"
#include "string"
int a[10000] = {0};//结果数组
void Calculate(int n)
{
int i;
int j;
int pos = 0;//当前结果数组a[]中最高的,a[pos]不是0值的下标
int x[10000] = {0};//处理进位的数组,
a[0] = 1; //初值
for (i = 1; i <= n; ++i)
{
memset(x, 0, sizeof(int)*10000);
for (j = 0; j <= pos; ++j)
{
int k;
int t = 0;
int num = i*a[j]+ x[j];//第j位乘以i,再加上第j位的进位;
k = num%10; //本次计算的余数
t = num/10; //本次的进位,这个值开始时可能较小,但是当计算的阶乘的数值增加时,该值会很大
//如果进位不用数组保存,会导致num溢出
for (int m = j; t > 0; ++m)//处理进位,因为可能有溢出,所以用数组处理
{
x[m+1] = t%10; //如当前i==100,a[j]==8,i*a[j] == 800,这个会进两位;
t = t/10;
}
a[j] = k;
}
for (int p = j; x[p] > 0; ++p,++pos)//剩余部分加入,最后一个值可能进多个位
a[p] = x[p];
for (int q = pos; q >=0; --q)//输出每次的阶乘结果
printf("%d", a[q]);
printf("\n");
}
}
void _tmain()
{
Calculate(60);
getchar();
}
相关阅读 更多 +