大数问题:大数加法 与 大数乘法 最简单大数乘法
大数加法很简单,大叔乘法只是以大数加法为基础的,光从难度来说,两者差不多。
思路:这里没有借鉴别人牛逼的算法,现在也没有这个需求,就用最通俗的思路自己想了一个。
先举一个简单的例子
所以乘法就是每一位个位数相乘再乘以多少次方就可以了,这个多少次就是两者的数组位置的索引相加。
看看关键代码
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(); } }
大数问题:大数加法 与 大数乘法 最简单大数乘法相关推荐
- 高精度加法(非负)和大数阶乘及和汽水问题
高精度加法(非负)和大数阶乘 文章目录 高精度加法(非负)和大数阶乘 一.问题描述 二.代码 三.问题描述 四.代码 五.问题描述 六.代码 一.问题描述 二.代码 #define _CRT_SECU ...
- C语言——矩阵计算(转置、加法、减法、数乘、乘法)
使用该计算器可以帮助你快速完成矩阵的简单计算. #include <stdio.h> void menu() {printf("************************* ...
- 3个5相乘列乘法算式_6的乘法口诀教学设计范文
6的乘法口诀教学设计范文 作为一名辛苦耕耘的教育工作者,常常需要准备教学设计,借助教学设计可以更好地组织教学活动.你知道什么样的教学设计才能切实有效地帮助到我们吗?下面是小编收集整理的6的乘法口诀教学 ...
- 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37564426/article/ ...
- Java实现大数乘法_java实现大数加法、乘法(BigDecimal)
之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...
- java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...
[九九乘法表]九九乘法表学习攻略九九乘法表快速记忆小诀窍 很多孩子的九九乘法表还是背的不熟练,下面是精心为大家整理的九九乘法表学习攻略,欢迎阅读.更多九九乘法表学习攻略相关内容请关注实用资料栏目! & ...
- 汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法指令
2019独角兽企业重金招聘Python工程师标准>>> 本文分为3个模块. 示例---该指令的示例 解释---为指令不好理解的地方 练习---为了更熟悉该指令 1.1 有符号除法指令 ...
- 印度乘法口诀双位数乘法详解
近日来,网上流传着一个"印度乘法口诀".和我们中国的乘法表不同,这个乘法表延伸到19以内,即所谓"19*19"乘法表.尽管其难度比"九九乘法表&quo ...
- 二进制补码乘法除法_二进制乘法和除法
二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制 ...
最新文章
- 数据科学中一些不常用但很有用的Python库
- Luogu P3321 [SDOI2015]序列统计
- 【SQL Join】两个字段关联到同一个表,如何使用left join
- python自动获取cookie_selenium3+python自动化12-cookie相关操作(获取和删除)
- 前端对div连线_《前端图形学从入门到放弃》003 三维世界
- 视图编辑php,PhpStorm视图模式
- springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...
- jmeter web监听结果_Jmeter性能测试
- Ubuntu18.04应用程序安装集锦
- ubuntu 16.04安装mysql_Ubuntu 16.04 安装mysql 5.7.16
- JavaScript 移动和触摸框架
- 《视觉SLAM十四讲》笔记
- android dex2oat 编译,dex2oat代码阅读笔记
- 两个鸡蛋和一百层楼的问题
- 富士施乐FujiXeroxDocuCentre-V2060扫描到PC
- 随笔(面试相关)(杂)
- CC00028.CloudKubernetes——|KuberNetes二进制部署.V06|5台Server|——|etcd配置|
- 2021年森林督查暨森林资源管理“一张图”更新工作方案
- PHP中终止程序输出的exit和die
- 汇编语言——指令系统小结