C语言高精度阶乘优化,阶乘和(高精度c语言)急急急

追问:#include

using namespace std;

typedef struct bignum

{

int v[1024],v_l;

}BIGNUM,*PBIGNUM;

BIGNUM num1,num2,n,t,ans;

char sz[1024];

BIGNUM mult(BIGNUM a,BIGNUM b)

{

BIGNUM t;

memset(t.v,0,sizeof(t.v));

int i,j;

for(i=0;i

{

for(j=0;j

t.v[i+j]+=a.v[i]*b.v[j];

}

for(i=0;i

{

t.v[i+1]+=t.v[i]/10;

t.v[i]%=10;

}

t.v_l=a.v_l+b.v_l;

while(t.v_l>1&&t.v[t.v_l-1]==0)

t.v_l--;

return t;

}

BIGNUM add(BIGNUM a,BIGNUM b)

{

BIGNUM t;

memset(t.v,0,sizeof(t.v));

int i,j;

t.v_l=max(a.v_l,b.v_l)+1;

for(i=0;i

t.v[i]=a.v[i]+b.v[i];

for(i=0;i

{

t.v[i+1]+=t.v[i]/10;

t.v[i]%=10;

}

while(t.v_l>1&&t.v[t.v_l-1]==0)

t.v_l--;

return t;

}

int BIGNUMcmp(BIGNUM a,BIGNUM b)

{

if(a.v_l>b.v_l)

return 1;

else if(a.v_l

return -1;

else

{

int i;

for(i=a.v_l-1;i>=0;i--)

{

if(a.v[i]>b.v[i])

return 1;

else if(a.v[i]

return -1;

}

return 0;

}

}

BIGNUM jc(BIGNUM t)

{

if(BIGNUMcmp(t,n)==0)

return n;

return mult(jc(add(t,num1)),t);

}

void mypf(BIGNUM c)

{

int i;

for(i=c.v_l-1;i>=0;i--)

printf("%d",c.v[i]);

}

void myset(BIGNUM & a,int n)

{

for(a.v_l=0;a.v_l

a.v[a.v_l]=a.v_l+1;

num1.v[0]=1;

num1.v_l=1;

num2.v[0]=0;

num2.v_l=1;

}

int main()

{

int i,n;

scanf("%d",n);

myset(t,n);

for(i=0;i

{

num2=add(num2,num1);

add(ans,jc(num2));

}

mypf(ans);

return 0;

}

追问:帮忙改一下,谢大佬。

追答:你程序看上去较乱,这个没必要用结构,且你既然定义了全局的,就不用参数了

改你的程序的工作量还不如我随手重写一个,简单的测试没有问题,你参考下

#include

#include

using namespace std;

int a[1026],s[1026];

int fac(int n)

{

int len, i, j, k;

memset(a,0,sizeof(a));

a[1] = 1;

len = 1;

for(i = 1 ; i <= n ; i++) {

for(j = 1; j <= len; j++)

a[j] = a[j] * i;

len = i + j;

for(k = 1; k <= len; k++) {

a[k + 1] += a[k] / 10;

a[k] %= 10;

}

while(a[len] == 0) len--;

}

return len;

}

int add(int len)

{

static int slen=0;

int i,j;

if (slen

slen=len;

for(i = slen ; i >= 1; i--)

s[i]+=a[i];

for(j = 1; j <= slen; j++) {

s[j + 1] += s[j] / 10;

s[j] %= 10;

}

while(a[++slen] != 0) ;

slen--;

return slen;

}

int main(void)

{

int i,n,len;

cin >>n;

for(i=1; i<=n; i++) {

len=fac(i);

len=add(len);

}

for(i = len ; i >= 1; i--)

cout << s[i] ;

cout << endl;

return 0;

}

追问:但是这个我们老师让我们起结构啊,你也不用改了,就看看哪里有问题吧(现在是输出不了,return一个奇怪的数,好像322开头)。

追答:两个大问题,一个是初学者都会犯的错

scanf("%d",n);

你的n要取地址的,要用&n

其次是你的

BIGNUM jc(BIGNUM t)

{

if(BIGNUMcmp(t,n)==0)

return n;

return mult(jc(add(t,num1)),t);

}

你是递归,而n!的递归是

f(n)=f(n-1)*n,终止条件是n==1(或n>=0)

怎么也不可能有加法

你的公式是

f(t)=f(t+num1)*n,终止条件是t==n

死循环了

你可能感兴趣的:(C语言高精度阶乘优化)