C语言实现大数乘法

Linux大全评论467 views阅读模式

实现过程分析:

我们回忆一下,在我们小时候刚接触多位数的乘法,我们的数学老师会教给我们一个方法,那就是“乘法的竖式计算”。在这里我们就采用该思想解决大数乘法的问题。       

以下是我们经常进行乘法的竖式运算:

根据以上的竖式运算,我们实现过程总结如下:

1、先使用两个字符数组保存两个大数据;

2、用第一个数据的个位与第二个数据的所有位相乘,并将每一位的运算结果保存在暂存字符数组temp中,并进行进位调整,即如果该位的数值大于9,就将该数值的十位加到前一位,并将该位的个位保存在原位。

3、将temp与结果数组rst中的数值逆序相加,也就是从两个数组的倒数第一位开始相加。

4、以相同的方法,计算出第一个数据的十位与第二个数据相乘的结果,并保存至temp中。

5、将temp与rst倒数第二位的结果开始逆序相加。

6、第一个数据有几位就将以上过程进行几次。

注:对于确定每次与rst的倒数第几位相加时,可以采用一个bit变量存下正在进行第一个数据的第几位数据的运算,在最终相加时,在rst数组的末尾减去bit就是,应该与temp最后一位相加的位数。

C语言实现过程:

OK! 我们可以带着对这个乘法竖式的重新理解来解决我们的大数乘法问题,以下是C语言实现的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXLEN (100)
#define RSTMAX (1000000)
 
int main(int ac, char **av)                                                                                   
{
    char Mp1[MAXLEN] = {0}, Mp2[MAXLEN] = {0}; 
    char temp[MAXLEN + 3] = {0}, rst[RSTMAX] = {0};
    int  i = 0, j = 0, t = 0, s = 0;
    int  len1 = 0, len2 = 0;
    int  bit = 0;
 
    printf("============= Welcome to Mutip Calculate ============\n");
    printf("Please enter two number you want to calculate : \n");
    scanf("%s%s", Mp1, Mp2);
 
    len1 = strlen(Mp1);
    len2 = strlen(Mp2);
    for(j = len2 - 1; j >=0; --j){
      for(i = len1 - 1, t = len1; i >= 0; --i, --t){
          // let two number not two character to multiply
          temp[t] = (Mp1[i] - 0x30) * (Mp2[j] - 0x30); 
          // 0x30 == 48 == '0'
      }       
         
      // adjust temp's each bit number which more than 9 to between 0 to 9
      for(t = len1; t >0; --t){
          if(temp[t] > 9){
              temp[t-1] += temp[t]/10;
              temp[t] %= 10;
          }
      }
 
      // sum the new result to the original result;       
      for(s = len1 + len2 - bit, t = len1; t >= 0; --s, --t){
          rst

展开收缩
+= temp[t];
      }
 
      // ajust the new result which more than 9                                                                                   
      for(s = len1 + len2; s > 0; --s){
            if(rst
展开收缩
> 9){
                rst[s-1] += rst
展开收缩
/10;
                rst
展开收缩
%= 10;
            }
        }
 
        // bzero the temp array
        for(t = len1; t >= 0; --t){
            temp[t] = 0;
        }
        bit++;
    }
     
    // in order to narmal output the result as a string not a interge
    rst[len1 + len2 + 1] = '\0';
     
    // switch rst's each bit to character save into the result array.
    for(s = 0; s <= len1 + len2; ++s){
        rst
展开收缩
+= 0x30;
    }
 
    // delete the first zero before output the result.   
    for(s = 0; s < len1 + len2; ++s){
        if(0x30 == rst[0]){
            for(t = 0; t <= len1 + len2 - s; ++t){
                rst[t] = rst[t+1];
            }   
        }else{
            break;
        }
    }
 
    // output the result;
    printf("%s * %s = %s\n", Mp1, Mp2, rst);
    printf("========== Bye Bye ==========\n");
    return 0;
}

企鹅博客
  • 本文由 发表于 2020年8月29日 21:13:49
  • 转载请务必保留本文链接:https://www.qieseo.com/133581.html

发表评论