- 语法: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';}
- }
各种大数算法
最新推荐文章于 2022-01-15 17:39:55 发布