/*可以计算到10000的阶乘的程序,很快*/
#include <stdio.h>
#include <stdlib.h>
/*如果计算100000的阶乘,MAX写成120000即可,有456574位,
但是用的时间可能就会到几分钟甚至更多了,
这个算法是O(n^2)的复杂度的*/
#define D 10000 /*10000进制*/
#define MAX 10000
int f[MAX], len;
void init( void )
{
f[0] = 1;
for (int i = 1; i < MAX; i ++)
f[i] = 0;
len = 1;
}
int mul1(int * dest, int n, int len)
{
int t = 0;
for (int i = 0; i < len; i ++)
{
t += dest[i] * n;
dest[i] = t % D;
t /= D;
}
return t;
}
void show(int n)
{
printf("\n%d的阶乘结果是:\n", n);
printf("%4d", f[len-1]);
if (len > 1)
for (int i = len - 2; i >= 0; i --)
{
printf("%04d", f[i]);
}
printf("\n\n");
}
int main( void )
{
int n;
printf("整数阶乘计算程序,最大计算到%d的阶乘\n", MAX);
while (1)
{
printf("输入一个整数(小于等于0或者大于%d结束):", MAX);
scanf_s("%d", &n);
if ((n <= 0) || (n > MAX)) break;
init( );
for (int i = 1; i <= n; i ++)
{
int t = mul1(f, i, len);
if (t > 0)
{
len ++;
if (len > MAX)
{
printf("\n错误:结果溢出\n");
break;
}
f[len - 1] = t;
}
}
show(n);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
/*如果计算100000的阶乘,MAX写成120000即可,有456574位,
但是用的时间可能就会到几分钟甚至更多了,
这个算法是O(n^2)的复杂度的*/
#define D 10000 /*10000进制*/
#define MAX 10000
int f[MAX], len;
void init( void )
{
f[0] = 1;
for (int i = 1; i < MAX; i ++)
f[i] = 0;
len = 1;
}
int mul1(int * dest, int n, int len)
{
int t = 0;
for (int i = 0; i < len; i ++)
{
t += dest[i] * n;
dest[i] = t % D;
t /= D;
}
return t;
}
void show(int n)
{
printf("\n%d的阶乘结果是:\n", n);
printf("%4d", f[len-1]);
if (len > 1)
for (int i = len - 2; i >= 0; i --)
{
printf("%04d", f[i]);
}
printf("\n\n");
}
int main( void )
{
int n;
printf("整数阶乘计算程序,最大计算到%d的阶乘\n", MAX);
while (1)
{
printf("输入一个整数(小于等于0或者大于%d结束):", MAX);
scanf_s("%d", &n);
if ((n <= 0) || (n > MAX)) break;
init( );
for (int i = 1; i <= n; i ++)
{
int t = mul1(f, i, len);
if (t > 0)
{
len ++;
if (len > MAX)
{
printf("\n错误:结果溢出\n");
break;
}
f[len - 1] = t;
}
}
show(n);
}
return 0;
}