满意答案
红魔7欧文
2013.07.02
采纳率:45% 等级:12
已帮助:3012人
哈哈,我刚刚写了一个精确计算阶乘的程序,下面是截图:只不过我用的是静态数组,可以精确到100万位,但我还没有测试过阶乘100万位的数字是多少,因为这太耗时间了。按照你的要求,只需要将静态数组改为动态的就行了。因我的代码是BCB的,可能不适合你。下面的代码是我回答XX计算5!+10!+15!+....100!的C版,你要适当改一下(注释应试比较清楚了)://由于使用了很大数组,内存消耗特大,静态数组直接占用栈空间,请在IDE中将Max stack size设为最大0x01000000
//也可以采用动态数组
#define MaxDigitCount 1024000
char ValBuf[MaxDigitCount+2];//存放n!结果值,1位数占一个字节,且颠倒存放,第1位为个位,第2位为十位...,这样便于向后进位
char TmpBuf[MaxDigitCount+2]; //存放中间结果
char SumBuf[MaxDigitCount+2];//求和结果//---------------------------------------------------------------------------
void fact(int n){
register i,j,k,m;
char nstr[100];
register char *p1,*p2,*p3,*pStart,*pEnd;
memset(ValBuf,0,sizeof(ValBuf));
ValBuf[0]='1';//乘数先置1
while(n>1){
sprintf(nstr,"%d",n--);
pStart=nstr;
pEnd=pStart+strlen(nstr)-1;
p1=pEnd ;
memset(TmpBuf,0,sizeof(TmpBuf));
m=0;
while(p1>=pStart){//被乘数从末位开始乘
i=*p1-'0';
p2=ValBuf;
p3=TmpBuf+m++;
k=0;
while(*p2){
j=*p2-'0';//字符还原成数值
j*=i;//乘
j+=k;//加上进位数
if(*p3)j+=*p3-'0';//加上本位数
*p3=j%10+'0';//数值转存为字符
k=j/10; //进位值 p2++;
p3++;
}
while(k){//进位
if(p3>=TmpBuf+sizeof(TmpBuf)-2){
printf("数据溢出!");
break;
}
if(*p3)k+=*p3-'0';
*p3++=k%10+'0';
k/=10;
}
p1--;
}
memcpy(ValBuf,TmpBuf,p3-TmpBuf);//将中间结果复制到乘数
}
}void GetSum(){//将ValBuf加到SumBuf
register i,k;
register char *p1,*p2;
if(!SumBuf[0])strcpy(SumBuf,ValBuf);
else{
p1=SumBuf;p2=ValBuf;
k=0;
while(*p2){
i=*p1;
if(i)i-='0';
i+=*p2-'0'+k;
*p1=i%10+'0';
k=i/10;// 进位
p1++;p2++;
}
while(k){//考虑进位
if(p1>=SumBuf+sizeof(SumBuf)-2){
printf("数据溢出!");
break;
}
if(*p1)k+=*p1-'0';
*p1++=k%10+'0';
k/=10;
}
}}void printRuslt(){ //将结果颠倒输出
register char *p1=SumBuf;
register int count=0,Zero=0,NotZero=0;
while(*p1){ //统计末尾0的个数
count++;
if(*p1=='0'&&!NotZero)
Zero++;
else NotZero=1;
p1++;
}
if(count)p1--;
printf("结果为:\n");
do{
printf("%c",*p1--);
}while(p1>=SumBuf); printf("\n共%d位,末尾有%d个0",count,Zero);}int move(int num,int m){
char s1[20],s2[20];
int i,len;
sprintf(s1,"%d",num);
len=strlen(s1);
for(i=0;i
if(i
s2[i]=s1[i+len-m];
}else
s2[i]=s1[i-m];
}
s2[i]='\0';
return num=atof(s2);
}
void main(int argc, char* argv[])
{
int n;
printf("%d\n",move(12345,2));
memset(SumBuf,0,sizeof(SumBuf));
for(n=5;n<=10;n+=5){
fact(n);
GetSum();
}
printRuslt();
fgetchar();
}
00分享举报