大数加法很简单,大叔乘法只是以大数加法为基础的,光从难度来说,两者差不多。

思路:这里没有借鉴别人牛逼的算法,现在也没有这个需求,就用最通俗的思路自己想了一个。

先举一个简单的例子

所以乘法就是每一位个位数相乘再乘以多少次方就可以了,这个多少次就是两者的数组位置的索引相加。

看看关键代码

for (int i = 0; i < aLen; i ++) {for (int j = 0; j < bLen; j ++) {int[] c = new int[length];

        //先给后面的0补补好
        int height = (aLen - i - 1) + (bLen - j - 1);// 5 3

        int sum = a[i] * b[j];
        if (sum >= 10) {c[length - height - 1] = sum % 10;
            c[length - height - 2] = (sum - sum % 10) / 10;
        } else {c[length - height - 1] = sum;
        }result = plus(result, c);
    }
}

height就是次方,sum就是个位数相乘,我们只需要弄一个新的数组存放,只需要把sum移动height个位置,我们这个数就出来了。

至于这个plus就是把我们的结果数组和这一次的出来的数组相加就可以了,加完了就得出最终结果了。

上全部代码

public class BigNumberMultiDiv {//(a*10+b) * (c*10+d) = (a*c)*100 + (a*d+c*b)*10 + b*d

    int[] a;
    int[] b;

    BigNumberMultiDiv() {//先存放两个数据试试
        a = new int[6];//679
        a[0] = 6;
        a[1] = 7;
        a[2] = 9;
        a[3] = 8;
        a[4] = 8;
        a[5] = 8;

        b = new int[4];//8315
        b[0] = 8;
        b[1] = 3;
        b[2] = 1;
        b[3] = 5;

        //test1:600000 * 8000 = 4800000000

        int[] c = multi(a, b);

        for (int i = 0; i < c.length; i ++) {System.out.print(c[i] + " ");
        }}//大数加法 目前只考虑了正数
    int[] plus(int[] a, int[] b) {int aLen = a.length;
        int bLen = b.length;

        int maxLen = Math.max(aLen,bLen);
        int cLen = maxLen + 1;//由ab长度得出c长度,考虑到进位

        int c[] = new int[cLen];//注意一开始是倒序的

        int flag = 0;

        if (aLen == bLen) {for (int i = aLen - 1, j = 0; i >= 0; i --, j ++) {int num = a[i] + b[i] + flag;
                flag = 0;
                if (num >= 10) {num -= 10;
                    flag = 1;
                }c[j] = num;
            }if (flag == 1) {c[cLen - 1] = 1;
            }} else {int minLen = Math.min(aLen, bLen);
            int k = 0;//这里指代c数组的index

            //加他们共有的部分
            for (int i = aLen - 1, j = bLen -1; i > aLen - 1 - minLen; i --, j --) {int num = a[i] + b[j] + flag;
                flag = 0;

                if (num >= 10) {num -= 10;
                    flag = 1;
                }c[k] = num;
                k++;

            }//不公有的部分
            for (int i = maxLen - minLen - 1; i >= 0; i --) {int num = aLen > bLen ? a[i] + flag : b[i] + flag;
                flag = 0;

                if (num >= 10) {num -= 10;
                    flag = 1;
                }c[k] = num;
                k ++;

            }if (flag == 1) {c[cLen - 1] = 1;
            }}//倒序回来
        //真实位数
        int realLen = cLen;
        //代表没进位
        if (flag == 0) {realLen = cLen - 1;
        }int temp;
        int d[] = new int[realLen];
        for (int i = 0, j = realLen - 1; i < realLen; i ++, j --) {d[i] = c[j];
        }return d;
    }//大数乘法
    int[] multi(int[] a, int[] b) {//乘法可以乘出来的位数 a位数组 * b位数组 最小 a + b - 1位 最大 a + b位
        int aLen = a.length;
        int bLen = b.length;
        int length = aLen + bLen;

        int[] result = new int[length];

        //思路 两个for循环 结果等于每个数之间相乘并且乘以10的(i + j)次,得出这么多结果,累加
        for (int i = 0; i < aLen; i ++) {for (int j = 0; j < bLen; j ++) {int[] c = new int[length];

                //先给后面的0补补好
                int height = (aLen - i - 1) + (bLen - j - 1);// 5 3

                int sum = a[i] * b[j];
                if (sum >= 10) {c[length - height - 1] = sum % 10;
                    c[length - height - 2] = (sum - sum % 10) / 10;
                } else {c[length - height - 1] = sum;
                }result = plus(result, c);
            }}return result;

    }public static void main(final String[] args) throws Exception {BigNumberMultiDiv bigNumberMultiDiv = new BigNumberMultiDiv();
    }
}

大数问题:大数加法 与 大数乘法 最简单大数乘法相关推荐

  1. 高精度加法(非负)和大数阶乘及和汽水问题

    高精度加法(非负)和大数阶乘 文章目录 高精度加法(非负)和大数阶乘 一.问题描述 二.代码 三.问题描述 四.代码 五.问题描述 六.代码 一.问题描述 二.代码 #define _CRT_SECU ...

  2. C语言——矩阵计算(转置、加法、减法、数乘、乘法)

    使用该计算器可以帮助你快速完成矩阵的简单计算. #include <stdio.h> void menu() {printf("************************* ...

  3. 3个5相乘列乘法算式_6的乘法口诀教学设计范文

    6的乘法口诀教学设计范文 作为一名辛苦耕耘的教育工作者,常常需要准备教学设计,借助教学设计可以更好地组织教学活动.你知道什么样的教学设计才能切实有效地帮助到我们吗?下面是小编收集整理的6的乘法口诀教学 ...

  4. 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37564426/article/ ...

  5. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  6. java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...

    [九九乘法表]九九乘法表学习攻略九九乘法表快速记忆小诀窍 很多孩子的九九乘法表还是背的不熟练,下面是精心为大家整理的九九乘法表学习攻略,欢迎阅读.更多九九乘法表学习攻略相关内容请关注实用资料栏目! & ...

  7. 汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法指令

    2019独角兽企业重金招聘Python工程师标准>>> 本文分为3个模块. 示例---该指令的示例 解释---为指令不好理解的地方 练习---为了更熟悉该指令 1.1 有符号除法指令 ...

  8. 印度乘法口诀双位数乘法详解

    近日来,网上流传着一个"印度乘法口诀".和我们中国的乘法表不同,这个乘法表延伸到19以内,即所谓"19*19"乘法表.尽管其难度比"九九乘法表&quo ...

  9. 二进制补码乘法除法_二进制乘法和除法

    二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制 ...

最新文章

  1. 数据科学中一些不常用但很有用的Python库
  2. Luogu P3321 [SDOI2015]序列统计
  3. 【SQL Join】两个字段关联到同一个表,如何使用left join
  4. python自动获取cookie_selenium3+python自动化12-cookie相关操作(获取和删除)
  5. 前端对div连线_《前端图形学从入门到放弃》003 三维世界
  6. 视图编辑php,PhpStorm视图模式
  7. springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...
  8. jmeter web监听结果_Jmeter性能测试
  9. Ubuntu18.04应用程序安装集锦
  10. ubuntu 16.04安装mysql_Ubuntu 16.04 安装mysql 5.7.16
  11. JavaScript 移动和触摸框架
  12. 《视觉SLAM十四讲》笔记
  13. android dex2oat 编译,dex2oat代码阅读笔记
  14. 两个鸡蛋和一百层楼的问题
  15. 富士施乐FujiXeroxDocuCentre-V2060扫描到PC
  16. 随笔(面试相关)(杂)
  17. CC00028.CloudKubernetes——|KuberNetes二进制部署.V06|5台Server|——|etcd配置|
  18. 2021年森林督查暨森林资源管理“一张图”更新工作方案
  19. PHP中终止程序输出的exit和die
  20. 汇编语言——指令系统小结

热门文章

  1. hadoop关于hdfs详细解答
  2. 可截断素数(Truncatable primes)
  3. Redis的基本操作--Redis的常用语句
  4. 交叉验证(s折、分层、留一法)
  5. 天龙八部TLBB从0到1搭建教程-中
  6. 算法小白理解最大流最小割(Maximum flow Minimum cut)问题
  7. 助力全球抗疫,腾讯加入Linux基金会公共卫生计划
  8. html中一些标签怎么打印,html2ps - 如何打印小标签?
  9. PMP第八节:项目质量管理
  10. iOS企业证书的申请教程