表格法---大整数乘法
首先,将乘数和被乘数按照每三位进行划分,列出乘法表,乘数和被乘数的地位分别放在表格的右端和上端。
8 216 547
96 785
计算表格中的数值
8
216
547
*
768
20736
52512
96
6250
169560
429395
785
向右错位后按列相加
768
20736
52512
6250
169560
429395
768
27016
222072
429395
最后一行,从个位数开始,以1000进制进行进位,超出1000的部分进位到前一个方格里:
768
27016
222072
429395
768+27=795
27016+222=27238
222072+429=222501
留395进429
795
238
501
395
最后一排的最前端的方格可以不用再往前进位,所以8216547*96785 = 795238501395
import java.awt.List; import java.util.Scanner;/*** * @author yyc 大整数乘法:采用“表格法”*/ public class Main {public static void main(String[] args) {// TODO Auto-generated method stub// 输入乘数与被乘数Scanner scanner = new Scanner(System.in);String mulStrA = scanner.nextLine();String mulStrB = scanner.nextLine();// 求得乘积String resultStr = BigIntegerMul(mulStrA, mulStrB);System.out.println(resultStr);}public static String BigIntegerMul(String mulStrA, String mulStrB) {int[] mListA = SplitToArray(mulStrA);int[] mListB = SplitToArray(mulStrB);int[][] mulArray = new int[mListA.length][mListB.length];// 计算表格for (int i = 0; i < mListA.length; i++) {for (int j = 0; j < mListB.length; j++) {mulArray[i][j] = mListA[i] * mListB[j];}}// 错位累加int[] reArray = new int[mListA.length + mListB.length + 1];int lastEffectIndex = 0;for (int n = 0; n < reArray.length; n++) {int iniRe = 0;for (int j = n; j >= 0; j--) {int i = n - j;if ((j < mListB.length) && (i < mListA.length)) {iniRe += mulArray[i][j];lastEffectIndex = n;}}reArray[n] = iniRe;}// 进位操作for (int i = lastEffectIndex; i > 0; i--) {reArray[i - 1] += reArray[i] / 1000;reArray[i] = reArray[i] % 1000;}// 拼接结果StringBuffer sBuffer = new StringBuffer();for (int i = 0; i <= lastEffectIndex; i++) {String string = ((Integer) reArray[i]).toString();for (int j = 0; j < 3 - string.length(); j++) {sBuffer.append("0");}sBuffer.append(string);}return sBuffer.toString();}public static int[] SplitToArray(String mulStr) {// 将乘数与被乘数从各位开始,每三位划分,放入数据int len = (int) Math.ceil(((double) mulStr.length()) / 3);int[] mList = new int[len];int i = mulStr.length() - 1;int n = len - 1;while (i >= 0) {StringBuffer sb = new StringBuffer();int interval = 3;if (i < 2) {interval = i + 1;}for (int j = interval - 1; j >= 0; j--) {sb.append(mulStr.charAt(i - j));}mList[n] = Integer.parseInt(sb.toString());n--;i -= interval;}return mList;}}
表格法---大整数乘法相关推荐
- 【FFTNTT入门】大整数乘法
问题:给定两个大整数 A A A 和 B B B, A A A 和 B B B 的长度为 n n n 和 m m m,求 A A A 和 B B B 的乘积 1. 朴素做法 思考小学数学中两个数的乘法 ...
- 使用快速傅里叶变换计算大整数乘法-代码
在上一篇随笔"使用快速傅里叶变换计算大整数乘法"中,已经讲述了使用快速傅里叶变换计算大整数乘法的原理.在这一篇随笔中,我们就使用快速傅里叶变换来实现一个提供任意精度的算术运算的静态 ...
- 大整数乘法c语言代码_大整数乘法
大整数乘法和我们小学学过的乘法公式一样(如下图),就是按位相乘,两个数中的每一位彼此相乘,然后将相同列的结果加起来,最后统一处理进位即可. #include <iostream> #inc ...
- 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
[题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...
- 信息学奥赛一本通(1174:大整数乘法)
1174:大整数乘法 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 12480 通过数: 7002 [题目描述] 求两个不超过200位的非负整数的积. [ ...
- 大整数乘法--leetcode Multiply Strings
大整数乘法 本文转载自http://www.cnblogs.com/TenosDoIt/p/3735309.html 我们在日常的大整数计算中,通常是把它转化为字符型计算.这道题的思路就和我们小学计算 ...
- python两数相乘代码_Python 实现大整数乘法算法的示例代码
我们平时接触的长乘法,按位相乘,是一种时间复杂度为 O(n ^ 2) 的算法.今天,我们来介绍一种时间复杂度为 O (n ^ log 3) 的大整数乘法(log 表示以 2 为底的对数). 介绍原理 ...
- 计算机算法设计与分析 大整数乘法
大整数乘法 问题描述 求两个不超过200位的非负整数的积. 输入形式 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出形式 一行,即相乘后的结果.结果里不能有多余的前导0,即如果结 ...
- Bailian2980 大整数乘法【大数】
2980:大整数乘法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积. 输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出 一 ...
最新文章
- squid 优化指南
- 上传文件 微信小程序input_快速上手微信小程序UI框架
- python之Argparse模块
- JDK、Spring、Dubbo SPI 原理介绍
- step5 . day4 网络编程 基于UDP协议的网络编程流程及API
- android studio 快速删除无用的import包
- Hybris ECP(Enterprise Commerce Platform)的调试
- EF ++属性会更新实体
- java netty post_API调用Netty长链接执行发送消息(在线数、用户列表)
- 你怎么看待 Bug?
- @程序员:你的颈椎和你的代码一样有救了
- 在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium-转
- Zabbix Server 3.0官方跟踪连接接口
- core部署iis的 调试net_ASP.NET Core环境变量和启动设置的配置教程
- 51单片机用C语言实现交通灯(红绿灯)源程序实训QY-KP1
- 1288元,苍井空“空系列”内衣微博开卖
- 头脑王者 物理化学生物
- 怎么在当前文件目录下打开CMD
- SQL查询实现差集(补集)运算
- 利用Python创建一个游戏窗口