c语言如何计算大数,大数相关计算(c语言版)

语法:int result=factorial(int n);

参数:

n:

n 的阶乘

返回值:

阶乘结果的位数

注意:

本程序直接输出n!的结果,需要返回结果请保留long a[]

需要 math.h

源程序:

int factorial(int n)

{

long a[10000];

int i,j,l,c,m=0,w;

a[0]=1;

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

{

c=0;

for(j=0;j<=m;j++)

{

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

c=a[j]/10000;

a[j]=a[j]%10000;

}

if(c>0) {m++;a[m]=c;}

}

w=m*4+log10(a[m])+1;

printf("\n%ld",a[m]);

for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);

return w;

}

2.精度计算——乘法(大数乘小数)

语法:mult(char c[],char t[],int m);

参数:

c[]:

被乘数,用字符串表示,位数不限

t[]:

结果,用字符串表示

m:

乘数,限定10以内

返回值:

null

注意:

需要 string.h

源程序:

void mult(char c[],char t[],int m)

{

int i,l,k,flag,add=0;

char s[100];

l=strlen(c);

for (i=0;i

s[l-i-1]=c[i]-'0';

for (i=0;i

{

k=s[i]*m+add;

if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else {s[i]=k;flag=0;add=0;}

}

if (flag) {l=i+1;s[i]=add;} else l=i;

for (i=0;i

t[l-1-i]=s[i]+'0';

t[l]='\0';

}

3.精度计算——乘法(大数乘大数)

语法:mult(char a[],char b[],char s[]);

参数:

a[]:

被乘数,用字符串表示,位数不限

b[]:

乘数,用字符串表示,位数不限

t[]:

结果,用字符串表示

返回值:

null

注意:

空间复杂度为 o(n^2)

需要 string.h

源程序:

void mult(char a[],char b[],char s[])

{

int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;

char result[65];

alen=strlen(a);blen=strlen(b);

for (i=0;i

for (j=0;j

for (i=alen-1;i>=0;i--)

{

for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];

result[k]=sum%10;

k=k+1;

sum=sum/10;

}

for (i=blen-2;i>=0;i--)

{

for (j=0;j<=i;j++) sum=sum+res[i-j][j];

result[k]=sum%10;

k=k+1;

sum=sum/10;

}

if (sum!=0) {result[k]=sum;k=k+1;}

for (i=0;i

for (i=k-1;i>=0;i--) s[i]=result[k-1-i];

s[k]='\0';

while(1)

{

if (strlen(s)!=strlen(a)&&s[0]=='0')

strcpy(s,s+1);

else

break;

}

}

4.精度计算——加法

语法:add(char a[],char b[],char s[]);

参数:

a[]:

被乘数,用字符串表示,位数不限

b[]:

乘数,用字符串表示,位数不限

t[]:

结果,用字符串表示

返回值:

null

注意:

空间复杂度为 o(n^2)

需要 string.h

源程序:

void add(char a[],char b[],char back[])

{

int i,j,k,up,x,y,z,l;

char *c;

if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;

c=(char *) malloc(l*sizeof(char));

i=strlen(a)-1;

j=strlen(b)-1;

k=0;up=0;

while(i>=0||j>=0)

{

if(i<0) x='0'; else x=a[i];

if(j<0) y='0'; else y=b[j];

z=x-'0'+y-'0';

if(up) z+=1;

if(z>9) {up=1;z%=10;} else up=0;

c[k++]=z+'0';

i--;j--;

}

if(up) c[k++]='1';

i=0;

c[k]='\0';

for(k-=1;k>=0;k--)

back[i++]=c[k];

back[i]='\0';

}

5.精度计算——减法

语法:sub(char s1[],char s2[],char t[]);

参数:

s1[]:

被减数,用字符串表示,位数不限

s2[]:

减数,用字符串表示,位数不限

t[]:

结果,用字符串表示

返回值:

null

注意:

默认s1>=s2,程序未处理负数情况

需要 string.h

源程序:

void sub(char s1[],char s2[],char t[])

{

int i,l2,l1,k;

l2=strlen(s2);l1=strlen(s1);

t[l1]='\0';l1--;

for (i=l2-1;i>=0;i--,l1--)

{

if (s1[l1]-s2[i]>=0)

t[l1]=s1[l1]-s2[i]+'0';

else

{

t[l1]=10+s1[l1]-s2[i]+'0';

s1[l1-1]=s1[l1-1]-1;

}

}

k=l1;

while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}

while(l1>=0) {t[l1]=s1[l1];l1--;}

loop:

if (t[0]=='0')

{

l1=strlen(s1);

for (i=0;i

t[l1-1]='\0';

goto loop;

}

if (strlen(t)==0) {t[0]='0';t[1]='\0';}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值