理解两个大数相乘过程

1,明确程序是一个通用法则。这个实现过程既可以满足一位数字相乘,也可以满足两位数字相乘。既然能够满足一位数字,两位数字,那么自然也能够满足多位数字相乘。

2,最开始自己面对这一道面试题,第一反应就是,我无法使用任何编程语言的基本数据类型去表示这样一个大数,自然也不能够满足这个数的乘积了。这也是这个面试题的难点。

3,我的想法就是抛开一切数学中的理论概念。用编程语言的字符组成字符串的方式进行思考。

4,思考了很久。也按照自己的想法分析这个大数的一些特征,比如大数的个数是明确的。我可以任意按照自己的想法去取。去拼接最后的一个结果。但是都没有想到一个解决思路。当然问题肯定能够解决的,只是会显得特别复杂,这样程序的易读性也就没有了。

5,网上搜寻资料。得到一个解决问题的思想。

思想:将输入的字符串,转成char数组,转成int数组。采用分治思想,每一位的相乘。

公式:AB*CD = AC (BC+ AD) BD,然后 从后到前满十进位。

举个例子

套用公式

6789 = 68(78 + 69)7*9

67*89 = 48(110)63

从后到前满十进位

63进6剩余3,

110变成116,满十进位,进行11,剩余6,

48变成59。所以: 5963

6,实现过程

  public static String mutiply(String a,String b){

        char chars1[] = a.toCharArray();
        char chars2[] = b.toCharArray();

        int result[] = new int[chars1.length + chars2.length];

        int n1[]= new int[chars1.length];

        int n2[]= new int[chars2.length];

        for (int i =0; i < chars1.length; i++){
            n1[i] = chars1[i] - '0';
        }
        for (int j =0; j < chars2.length; j++){

            n2[j] = chars2[j] - '0';

        }
        //逐个相乘
        for(int i = 0; i < chars1.length; i++){
            for(int j = 0; j < chars2.length; j++){
                result[i+j] += n1[i]  *  n2[j];
            }
        }
        //从后向前进位
        for (int i = result.length -1; i > 0; i--) {

            result[i-1] += result[i] / 10;

            result[i] = result[i] % 10;

        }

        String resultStr = "";

        for (int i = 0; i < result.length - 1; i++) {

            resultStr += "" +result[i];

        }

        return resultStr;
    }

运行结果:

输入6623423489782734982  345234625667346345345:
结果为:2286635129131451302563885888316384358790

7,关键点

    a,一个数乘以一个数的结果长度必定小于或者等于这个两个数长度之和。



    b,把char字符转成int型,需要这个字符减去字符0.

    字符和数字在内存里都是以ASCII形式存储的。'0'字符的ASCII是30。



    c,逐个相乘。(其实也是数组中根据index的对应位上进行相加累积)

算法是根据数据结构的。而我们的数据是放入数组中进行操作的。我怎样才能操作两个数据结构(数组)的每一位呢?刚接触编程的时候,通常会学习冒泡排序和选择排序,通过两层循环去遍历这个数据结构中的每一个数字(一般来说都是多位的)。并且这种基本算法思想,在实现业务逻辑过程中也是需要的,可见对基本知识的一个理解深度是很重要的。

    d,从后往前满十进位。一个操作。

    关键

            哪个位是进位并且作相加累积。

            哪个位是保存余下的数字。

图解循环过程

从后往前满十进位

                    21,进2,剩下1;

                    32+2为34,进3,剩下4;

                    34+3为37,进行3,剩下7;

                    28+3为31,进3,剩下1;

                    13+3为16,进1,剩下6;

                    4+1为5。所以:561741。

作者:illustriousness
来源:CSDN
原文:https://blog.csdn.net/outsanding/article/details/79472376

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值