系列1 系列2( 原创程序,禁止非法转载出版)
部分程序演示视频见教材,二维码扫描可直接观看
计算:10000!

//计算:10000!
//作者:丁亚涛
//日期:2018.12.2下午
//版权所有,请勿转载
//在测试笔记本需要1个小时以上的计算时间,共35660个数字,尾数有2499个0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENTH 50000 //10000!需要36000左右个字符
void StringMultiply(char *a,int n);
void StringAdd(char *a,char *b,int left);
char * Factorial(int n);
void main()
{
 printf("%s\n",Factorial(10000)); //10000!
}
// a[LENTH]*n
void StringMultiply(char *a,int n)
{
 int i,left=0;char s[LENTH]; //One Copy
 for(i=0;i<LENTH;i++) s[i]=a[i];
 i=0;while(a[i++]=='A') left++;left-=--n;
 for(i=1;i*2<=n;i=i*2)  StringAdd(a,a,left);
 n=n-(i-1);
 while(n-->0)StringAdd(a,s,left);
}
// a[LENTH]+b[LENTH]
void StringAdd(char *a,char *b,int left)
{
 int i=LENTH,j,k=0;
 while(--i>=left){
 j=a[i]-'A'+b[i]-'A'+k;
 k=j/10;
 j=j%10;
 a[i]='A'+j;}
}
//n!=1*2*...*n
char * Factorial(int n)
{
 char a[LENTH];  FILE *fp;  char TargetDir[30]="D:\\",f[30]="",t[30];
 int i,j,sl;
 for(i=0;i<LENTH-1;i++) a[i]='A';
 a[LENTH-1]='B';
 for(i=2;i<=n;i++)
{
 StringMultiply(a,i);
 if(i%100==0)
 {
  printf("%d.",i);
   if(i%1000==0)
   {
    strcpy(f,TargetDir);
    strcat(f,"fact");//base file name
    itoa(i,t,10);
    strcat(f,t);
    strcat(f,".txt");
    fp=fopen(f,"w+");
    for(j=0;j<LENTH;j++)
    fputc(a[j]-'A'+'0',fp);
    fclose(fp);
   }
  }
 }
 for(i=0;i<LENTH;i++)
  a[i]=a[i]-'A'+'0';
 i=j=0;
 while(a[i]=='0')i++;
 while(i<LENTH)a[j++]=a[i++];
 a[j]='\0';
 return a+0;
}

fact10000.txt

计算:10000!

//计算:10000!
//作者:丁亚涛
//日期:2019.1.26下午
//代码将发表在新版C语言教材中
//10秒内,共35660个数字,尾数有2499个0

fact10000.rar