各种大数算法

来源:互联网 发布:里德学院知乎 编辑:程序博客网 时间:2024/06/08 20:19
  1. 语法:int result=factorial(int n);  
  2. 参数:  
  3. n:  
  4.  n 的阶乘  
  5. 返回值:  
  6.  阶乘结果的位数  
  7. 注意:  
  8.  本程序直接输出n!的结果,需要返回结果请保留long a[]  
  9.  需要 math.h  
  10. 源程序:  
  11.  int factorial(int n)  
  12. {  
  13. long a[10000];  
  14. int i,j,l,c,m=0,w;   
  15.   
  16. a[0]=1;   
  17. for(i=1;i<=n;i++)  
  18.     {   
  19.     c=0;   
  20.     for(j=0;j<=m;j++)  
  21.         {   
  22.         a[j]=a[j]*i+c;   
  23.         c=a[j]/10000;   
  24.         a[j]=a[j]%10000;   
  25.     }   
  26.     if(c>0) {m++;a[m]=c;}   
  27. }   
  28.   
  29. w=m*4+log10(a[m])+1;  
  30. printf("\n%ld",a[m]);   
  31. for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);  
  32. return w;  
  33. }   
  34.    
  35.   
  36.   
  37. 2.精度计算——乘法(大数乘小数)  
  38. 语法:mult(char c[],char t[],int m);  
  39. 参数:  
  40. c[]:  
  41.  被乘数,用字符串表示,位数不限  
  42. t[]:  
  43.  结果,用字符串表示  
  44. m:  
  45.  乘数,限定10以内  
  46. 返回值:  
  47.  null  
  48. 注意:  
  49.  需要 string.h  
  50. 源程序:  
  51.    
  52.  void mult(char c[],char t[],int m)  
  53. {  
  54.     int i,l,k,flag,add=0;  
  55.     char s[100];  
  56.     l=strlen(c);  
  57.     for (i=0;i<l;i++)  
  58.         s[l-i-1]=c[i]-'0';   
  59.   
  60.     for (i=0;i<l;i++)  
  61.            {  
  62.            k=s[i]*m+add;  
  63.            if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else {s[i]=k;flag=0;add=0;}  
  64.            }  
  65.     if (flag) {l=i+1;s[i]=add;} else l=i;  
  66.   
  67.     for (i=0;i<l;i++)  
  68.         t[l-1-i]=s[i]+'0';  
  69.     t[l]='\0';  
  70. }  
  71.    
  72. 3.精度计算——乘法(大数乘大数)  
  73. 语法:mult(char a[],char b[],char s[]);  
  74. 参数:  
  75. a[]:  
  76.  被乘数,用字符串表示,位数不限  
  77. b[]:  
  78.  乘数,用字符串表示,位数不限  
  79. t[]:  
  80.  结果,用字符串表示  
  81. 返回值:  
  82.  null  
  83. 注意:  
  84.  空间复杂度为 o(n^2)  
  85.  需要 string.h  
  86. 源程序:  
  87.  void mult(char a[],char b[],char s[])  
  88. {  
  89.     int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;  
  90.     char result[65];  
  91.     alen=strlen(a);blen=strlen(b);   
  92.   
  93.     for (i=0;i<alen;i++)  
  94.     for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');  
  95.   
  96.     for (i=alen-1;i>=0;i--)  
  97.         {  
  98.             for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];  
  99.             result[k]=sum%10;  
  100.             k=k+1;  
  101.             sum=sum/10;  
  102.         }  
  103.   
  104.     for (i=blen-2;i>=0;i--)  
  105.         {  
  106.             for (j=0;j<=i;j++) sum=sum+res[i-j][j];  
  107.             result[k]=sum%10;  
  108.             k=k+1;  
  109.             sum=sum/10;  
  110.         }  
  111.     if (sum!=0) {result[k]=sum;k=k+1;}  
  112.   
  113.     for (i=0;i<k;i++) result[i]+='0';  
  114.     for (i=k-1;i>=0;i--) s[i]=result[k-1-i];  
  115.     s[k]='\0';  
  116.   
  117.     while(1)  
  118.         {  
  119.         if (strlen(s)!=strlen(a)&&s[0]=='0')   
  120.             strcpy(s,s+1);  
  121.         else  
  122.             break;  
  123.         }  
  124. }  
  125.    
  126. 4.精度计算——加法  
  127. 语法:add(char a[],char b[],char s[]);  
  128. 参数:  
  129. a[]:  
  130.  被乘数,用字符串表示,位数不限  
  131. b[]:  
  132.  乘数,用字符串表示,位数不限  
  133. t[]:  
  134.  结果,用字符串表示  
  135. 返回值:  
  136.  null  
  137. 注意:  
  138.  空间复杂度为 o(n^2)  
  139.  需要 string.h  
  140. 源程序:  
  141.  void add(char a[],char b[],char back[])  
  142. {  
  143.     int i,j,k,up,x,y,z,l;  
  144.     char *c;  
  145.     if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;  
  146.     c=(char *) malloc(l*sizeof(char));  
  147.     i=strlen(a)-1;  
  148.     j=strlen(b)-1;  
  149.     k=0;up=0;  
  150.     while(i>=0||j>=0)  
  151.         {  
  152.             if(i<0) x='0'else x=a[i];  
  153.             if(j<0) y='0'else y=b[j];  
  154.             z=x-'0'+y-'0';  
  155.             if(up) z+=1;  
  156.             if(z>9) {up=1;z%=10;} else up=0;  
  157.             c[k++]=z+'0';  
  158.             i--;j--;  
  159.         }  
  160.     if(up) c[k++]='1';  
  161.     i=0;  
  162.     c[k]='\0';  
  163.     for(k-=1;k>=0;k--)  
  164.         back[i++]=c[k];  
  165.     back[i]='\0';  
  166. }   
  167.    
  168. 5.精度计算——减法  
  169. 语法:sub(char s1[],char s2[],char t[]);  
  170. 参数:  
  171. s1[]:  
  172.  被减数,用字符串表示,位数不限  
  173. s2[]:  
  174.  减数,用字符串表示,位数不限  
  175. t[]:  
  176.  结果,用字符串表示  
  177. 返回值:  
  178.  null  
  179. 注意:  
  180.  默认s1>=s2,程序未处理负数情况  
  181.  需要 string.h  
  182. 源程序:  
  183.  void sub(char s1[],char s2[],char t[])  
  184. {  
  185.     int i,l2,l1,k;  
  186.     l2=strlen(s2);l1=strlen(s1);  
  187.     t[l1]='\0';l1--;  
  188.     for (i=l2-1;i>=0;i--,l1--)  
  189.         {  
  190.         if (s1[l1]-s2[i]>=0)   
  191.             t[l1]=s1[l1]-s2[i]+'0';  
  192.         else  
  193.             {  
  194.             t[l1]=10+s1[l1]-s2[i]+'0';  
  195.             s1[l1-1]=s1[l1-1]-1;  
  196.             }  
  197.         }  
  198.     k=l1;  
  199.     while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}  
  200.     while(l1>=0) {t[l1]=s1[l1];l1--;}  
  201. loop:  
  202.     if (t[0]=='0')   
  203.         {  
  204.         l1=strlen(s1);  
  205.         for (i=0;i<l1-1;i++) t[i]=t[i+1];  
  206.         t[l1-1]='\0';  
  207.         goto loop;  
  208.         }  
  209.     if (strlen(t)==0) {t[0]='0';t[1]='\0';}  
  210. }  
原创粉丝点击