大数相乘算法

来源:互联网 发布:淮安网络推广哪家强 编辑:程序博客网 时间:2024/05/16 17:17

 

我这里采取的方法是将大数保存在字符串中,然后将两个字符串逐位相乘,再进位和移位。应该还有效率更高的代码。

 源代码:

    

  

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. #define N 100  
  6.   
  7. /* 
  8.  *将在数组中保存的字符串转成数字存到int数组中 
  9. */  
  10. void getdigits(int *a,char *s)  
  11. {  
  12.      int i;  
  13.      char digit;  
  14.      int len = strlen(s);  
  15.   
  16.      //对数组初始化   
  17.      for(i = 0; i < N; ++i)  
  18.            *(a + i) = 0;  
  19.      for(i = 0; i < len; ++i){  
  20.            digit = *(s + i);  
  21.            *(a + len - 1 - i) = digit - '0';//字符串s="12345",因此第一个字符应该存在int数组的最后一个位置  
  22.      }  
  23. }  
  24.   
  25. /* 
  26.  *将数组a与数组b逐位相乘以后存入数组c 
  27.  */  
  28. void multiply(int *a,int *b,int *c)  
  29. {  
  30.      int i,j;  
  31.   
  32.      //数组初始化   
  33.      for(i = 0; i < 2 * N; ++i)  
  34.            *(c + i) = 0;  
  35.      /* 
  36.       *数组a中的每位逐位与数组b相乘,并把结果存入数组c 
  37.       *比如,12345*12345,a中的5与12345逐位相乘 
  38.       *对于数组c:*(c+i+j)在i=0,j=0,1,2,3,4时存的是5与各位相乘的结果 
  39.       *而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还会累加上上次相乘的结果.这一点是需要注意的!!! 
  40.      */  
  41.      for(i = 0; i < N; ++i)  
  42.            for(j = 0; j < N; ++j)  
  43.                  *(c + i + j) += *(a + i) * *(b + j);  
  44.      /* 
  45.       *这里是移位、进位 
  46.      */  
  47.      for(i = 0; i < 2 * N - 1; ++i)  
  48.      {  
  49.            *(c + i + 1) += *(c + i)/10;//将十位上的数向前进位,并加上原来这个位上的数  
  50.            *(c + i) = *(c + i)%10;//将剩余的数存原来的位置上  
  51.      }  
  52. }  
  53.   
  54. int main()  
  55. {  
  56.     int a[N],b[N],c[2*N];  
  57.     char s1[N],s2[N];  
  58.     int j = 2*N-1;  
  59.     int i;  
  60.       
  61.     printf("input the first number:");  
  62.     scanf("%s",s1);  
  63.     printf("/ninput the second number:");  
  64.     scanf("%s",s2);  
  65.       
  66.     getdigits(a,s1);  
  67.     getdigits(b,s2);  
  68.       
  69.     multiply(a,b,c);  
  70.       
  71.     while(c[j] == 0)  
  72.                j--;  
  73.     for(i = j;i >= 0; --i)  
  74.            printf("%d",c[i]);  
  75.     printf("/n");  
  76.     return 0;  
  77. }  

原创粉丝点击