Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1291819
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: C/C++

2013-08-09 16:35:22

下午写了一会,借鉴了别人的思想,很给力的乘法算法,一目了然,虽然听说最快的大数相乘是傅立叶算法...(只记得是FFT...)

又在边界问题出错了,下次错的话要在纸上多画一下,算一下,就明晰了


点击(此处)折叠或打开

  1. /********************************************
  2. 要求基本与相加一样
  3. void mul (const char *num1, const char *num2, char *result)
  4. ********************************************/

  5. #include<stdio.h>
  6. #include<string.h>
  7. /************************************************
  8. 编程思路:
  9. 基本与大数相加一样,思路清晰以后,注意边界问题。
  10. 不妨说说区别,大数相加得到最大大数的位数最多是len_max+1,
  11. 大数相乘,得到最大的数位数不会超过2×len_max;

  12. 此题的精华在于乘法的算法(

  13.     for(i = len_max - 1; i >= len_max - len1 ; i--)
  14.         for(j = i; j >= len_max -len2 ; j--)
  15.             p_r[len_r-1-(len_max-i-1)-(len_max-j-1)] += p_num1[i] * p_num2[j];

  16. 出错的地方:
  17. 在乘法算法的时候,边界问题,这里再出错,不妨在纸上画画。
  18.     p_r[len_r-1-(len_max-i-1)-(len_max-j-1)],是不是很复杂,想明白就不会忘了。

  19. *************************************************/
  20. void mul (const char *num1, const char *num2, char *result)
  21. {    
  22.     int len1, len2, len_max, len_r, i, j, flag1, flag2;
  23.     
  24.     char *p_num1, *p_num2, *p_r;
  25.     
  26.     len1 = strlen(num1);
  27.     len2 = strlen(num2);
  28.     
  29.     len_max = (len1 > len2) ? len1 : len2;
  30.     len_r = 2 * len_max;
  31.     
  32.     p_num1 = (char *)malloc(sizeof(char) * len_max);
  33.     p_num2 = (char *)malloc(sizeof(char) * len_max);
  34.     p_r = (char *)malloc(sizeof(char) * len_r);
  35.     
  36.     memset(p_num1, 0 , sizeof(char) * len_max);
  37.     memset(p_num2, 0 , sizeof(char) * len_max);
  38.     memset(p_r, 0 , sizeof(char) * len_r);
  39.     
  40.     flag1 = (num1[0] == '-') ? 1 : 0;
  41.     for(i = len1 - 1, j = 0; i >= 0 + flag1; i--,j++)
  42.     {    p_num1[len_max-1-j] = num1[i] - '0';

  43.     }

  44.     flag2 = (num2[0] == '-') ? 1 : 0;
  45.     for(i = len2 - 1, j = 0; i >= 0 + flag2; i--,j++)
  46.         p_num2[len_max-1-j] = num2[i] - '0';
  47.     //申请空间,字符转变为整型

  48.     for(i = len_max - 1; i >= len_max - len1 ; i--)
  49.         for(j = i; j >= len_max -len2 ; j--)
  50.             p_r[len_r-1-(len_max-i-1)-(len_max-j-1)] += p_num1[i] * p_num2[j];
  51.     
  52.     //运算结果低位到高位依次存在p_r向前的数组下标中

  53.     for(i = len_r - 1; i > 0 ; i--)
  54.     {
  55.         if(p_r[i] >= 10)
  56.         {
  57.             p_r[i-1] += p_r[i]/10;
  58.             p_r[i] = p_r[i] % 10;    
  59.         }    
  60.     }
  61.     //进位操作

  62.     i = j = 0;        
  63.      while(p_r[i] == 0)
  64.      i++;    
  65.     if(flag1 == flag2)//符号相同
  66.     {    
  67.         while(i < len_r)
  68.             result[j++] = p_r[i++] + '0';
  69.         result[j] = '\0';
  70.     }
  71.     else //符号不同
  72.     {
  73.         result[0] = '-';
  74.         while(i < len_r)
  75.         {    printf("i = %d, p_r[i] = %d, \n", i,p_r[i]);
  76.             result[1+(j++)] = p_r[i++] + '0';
  77.             
  78.         }
  79.         result[j+1] = '\0';
  80.     }

  81.     
  82.     return result;                         
  83. }

  84. int main(int argc, char **argv)
  85. {
  86.     char result[100] = {0};
  87.     
  88.     char *p1 = "35";
  89.     char *p2 = "-120";
  90.     
  91.     mul(p1, p2, result);
  92.     printf("result = %s", result);
  93.     while(1);
  94.         
  95. }

阅读(2447) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~