當前位置:編程學習大全網 - 編程語言 - C語言編程 大數階乘減法

C語言編程 大數階乘減法

看這種題太費事,看不如寫,所以妳看我給妳寫的吧!200內也沒有什麽問題……

//#include "stdafx.h"//vc++6.0加上這壹行.

#include "stdio.h"

#include "string.h"

#include "math.h"

#include "stdlib.h"

char *Fact(int n){

int i,j,k,tmp,len;

char *pa,*pb,*px,s[11]="",*ps9=s+9;

double dec=0;

for(n++,i=2;i<n;dec+=log10(i++));

len=(int)dec+2;

if(!(pa=(char *)malloc(len)) || !(pb=(char *)malloc(len))){

printf("Application memory failure...");

exit(0);

}

for(i=0;i<len;*(pa+i)=*(pb+i++)=0);

for(i-=2,j=--n;j;*(pb+i--)=j%10,j/=10);

len--;

i++;

while((k=--n)>1){

for(px=ps9;k;*px--=k%10,k/=10);

for(k=0,tmp=ps9-px;k<tmp;k++){

for(px=ps9,j=len-1;j>=i;*(pa+j-k)+=*(pb+j--) * *(px-k));

for(px=pa-k,j=len-1-k;j>=i-k;j--){

if(*(px+j)>9){

*(px+j-1) += *(px+j)/10;

*(px+j) %= 10;

}

}

if(i) i--;

}

px=pa;

pa=pb;

pb=px;

for(k=0;k<len;*(pa+k++)=0);

}

free(pa);

for(i=0;i<len;*(pb+i++)+='0');

return pb;

}

void Fn_Fm(char *pa,char *pb){

int i=strlen(pa),j=strlen(pb),len=i;

char *p,*p0;

if(i<j) len=j;

if(!(p0=p=(char *)malloc((len+2)*sizeof(char)))){

printf("Memory allocation failure!");

exit(0);

}

while(*p++='0',len>i++);

while(*p++=*pa++);

p-=(j+1);//

while(*p++ -=(*pb++ -'0'),*pb);

for(p--;p>p0;p--)

if(*p <'0'){

*p+=10;

(*(p-1))--;

}

if(*p<'0'){

printf("-");

for(p+=len,(*p)--;p>p0;p--)

if((*p=0x69-*p)>'9'){

*p-=10;

(*(p-1))--;

}

}

while(*p<='0' && *p!='\0') p++;

if(*p) printf("%s.\n",p);

else printf("0.\n");

free(p0);

}

void main(void){

int n,m;

char *pm,*pn;

printf("Please enter m & n(int:0<=m<=n).\n");

scanf("%d%d",&n,&m);

Fn_Fm(pn=Fact(n),pm=Fact(m));

free(pm);

free(pn);

printf("\n");

}

  • 上一篇:創意海報背景圖-海報設計
  • 下一篇:電焊工好學嗎?
  • copyright 2024編程學習大全網