文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>大数类相关计算(c语言版)

大数类相关计算(c语言版)

时间:2011-04-17  来源:void-man

语法: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<l;i++)
s[l
-i-1]=c[i]-'0';

for (i=0;i<l;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<l;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<alen;i++)
for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');

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<k;i++) result[i]+='0';
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<l1-1;i++) t[i]=t[i+1];
t[l1
-1]='\0';
goto loop;
}
if (strlen(t)==0) {t[0]='0';t[1]='\0';}
}
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载