码迷,mamicode.com
首页 > 编程语言 > 详细

大数乘法(C语言实现)

时间:2016-04-03 20:35:46      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:大数乘法   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;
}

  运行结果如下:

[root@anna-laptop C]# ./Multip 
============= Welcome to Mutip Calculate ============
Please enter two number you want to calculate : 
123456789
987654321
123456789 * 987654321 = 121932631112635269
========== Bye Bye ==========


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

大数乘法(C语言实现)

标签:大数乘法   c语言实现   乘法竖式   

原文地址:http://11229885.blog.51cto.com/11219885/1759854

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!