大数乘法(C语言实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数乘法(C语言实现)相关的知识,希望对你有一定的参考价值。

实现过程分析:

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

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

技术分享

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

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

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

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

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

5、temprst倒数第二位的结果开始逆序相加。

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 rst;        
       for(s = len1 + len2 - bit, t = len1; t >= 0; --s, --t){
           rst[s] += temp[t];
       }

       // ajust the new result which more than 9                                                                                   
       for(s = len1 + len2; s > 0; --s){
            if(rst[s] > 9){
                rst[s-1] += rst[s]/10;
                rst[s] %= 10;
            }
        }

        // bzero the temp
        for(t = len1; t >= 0; --t){
            temp[t] = 0;
        }
        bit++;
    }
    
    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[s] += 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;
}

  运行结果如下:

[[email protected] C]# ./Multip 
============= Welcome to Mutip Calculate ============
Please enter two number you want to calculate : 
123456789
987654321
123456789 * 987654321 = 121932631112635269
========== Bye Bye ==========


本文出自 “11219885” 博客,转载请与作者联系!

以上是关于大数乘法(C语言实现)的主要内容,如果未能解决你的问题,请参考以下文章

LQ0234 大数乘法程序填空

大数运算(加减乘除)

大数乘法

C语言实现矩阵乘法

Karatsuba乘法--实现大数相乘

C语言2个数相乘