这个问题其实并不难,主要是要采用合理的数据结构。
我用的是数组,int mul[1000],并将每个元素限定在 unit = 100 即 100 进制。
效率的确是有待改进,不过除非你要算宇宙的大小,否则耗时可以忽略不计。
关键是简短易懂,可移植。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h>
#define UNIT 1000
#define MUL 100000
void factorial(long int n);
int mul[MUL]; /* 每个元素规模为 UNIT,共 MUL 个,总共能储存 UNIT ^ MUL 规模数据 */
int main()
{
FILE *fp = fopen("result.txt", "w");
long int i, j;
mul[0] = 1;
factorial(10000);
for(i=MUL-1; mul[i] == 0 && i>=0; i--);
fprintf(fp, "%d e %ld\n", mul[i], i* 3);
for( ; i>=0; i--)
{
if(mul[i] == 0)
{
for(j=UNIT; j/10 > 0; j/=10)
fprintf(fp, "%d", 0);
/*这里注意0的打印问题,数组某一项中如果存放的是00,那就应该显示两个0. */
}
else fprintf(fp, "%d", mul[i]);
}
getchar();
fclose(fp);
exit(0);
}
void factorial(long int n)
{
static long int k;
long int i;
if(n == 1) return;
else
{
for(k=MUL-1; mul[k] == 0 && k>=0; k--);
for(i=0; i<=k; i++)
mul[i] *= n;
for(i=0; i<=k; i++)
{
if(mul[i] >= UNIT)
{
mul[i+1] += mul[i] / UNIT;
mul[i] %= UNIT;
}
}
factorial(n-1);
}
}
#define UNIT 1000
#define MUL 100000
void factorial(long int n);
int mul[MUL]; /* 每个元素规模为 UNIT,共 MUL 个,总共能储存 UNIT ^ MUL 规模数据 */
int main()
{
FILE *fp = fopen("result.txt", "w");
long int i, j;
mul[0] = 1;
factorial(10000);
for(i=MUL-1; mul[i] == 0 && i>=0; i--);
fprintf(fp, "%d e %ld\n", mul[i], i* 3);
for( ; i>=0; i--)
{
if(mul[i] == 0)
{
for(j=UNIT; j/10 > 0; j/=10)
fprintf(fp, "%d", 0);
/*这里注意0的打印问题,数组某一项中如果存放的是00,那就应该显示两个0. */
}
else fprintf(fp, "%d", mul[i]);
}
getchar();
fclose(fp);
exit(0);
}
void factorial(long int n)
{
static long int k;
long int i;
if(n == 1) return;
else
{
for(k=MUL-1; mul[k] == 0 && k>=0; k--);
for(i=0; i<=k; i++)
mul[i] *= n;
for(i=0; i<=k; i++)
{
if(mul[i] >= UNIT)
{
mul[i+1] += mul[i] / UNIT;
mul[i] %= UNIT;
}
}
factorial(n-1);
}
}