浅谈一下大数相乘有关思路(图解)与用java代码具体解决方案

本文主要是介绍浅谈一下大数相乘有关思路(图解)与用java代码具体解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

浅谈一下大数相乘有关思路(图解)与用java代码具体解决方案

    这两天,Java老师让我们用Java语言写一个关于大数(即超出java关键字,如long等表示的范围之外的整数)加减乘运算的小程序,不用Java自带API。

    至于加减运算在这就不说了,一般的Java实验指导书上都有相关代码,关键是考虑进位,退位。下面着重谈一谈大数相乘的有关思路。考虑到文字不太让人有阅读下去的欲望,下面是用windows7自带画图工具画的具体思路以及具体代码。

    为了方便画图及说明,图以两小数1234和3456相乘为例,大数的思路等同。

思路图解

Step 1:

 

 

Step 2:

Step 3:

  

Step 4:

 

    思路清晰了,下面就应该进行具体的代码实现了。

具体代码实现:

做了两个类成员方法函数,分别为①doMul(String,String):String和②doMul(char[],char[]):int[]

①doMul(String,String):String

/*
大整数乘法的转换函数
*/
public static String doMul(String data1,String data2) {int i = 0,j = 0;if(data1.charAt(0) == '-') {data1 = data1.substring(1);//去掉大整数前面的负号i++;}if(data2.charAt(0) == '-') {data2 = data2.substring(1);//去掉大整数前面的负号j++;}char[] char1 = data1.toCharArray();   char[] char2 = data2.toCharArray();int[] result = doMul(char1,char2);String jieguo = "";if(i+j == 1) {jieguo = "-";for(int k = 0; k < char1.length + char2.length-1; k++)  {jieguo += result[k];}}else {for(int k = 0; k<char1.length+char2.length-1; k++)  {jieguo += result[k];}}return jieguo;
}


②doMul(char[],char[]):int[]

/*
高精度乘法函数
*/
public static int[] doMul(char[] char1 , char[] char2) {int[] a = new int[char1.length];int[] b = new int[char2.length];int[] result = new int[char1.length + char2.length-1];int[][] c = new int[char1.length][char2.length];String jieguo = "";//最终结果的字符串形式for(int i = 0; i<char1.length ; i++) {a[i] = Integer.parseInt(char1[i] + "");}for(int i = 0; i<char2.length ; i++) {b[i] = Integer.parseInt(char2[i] + "");}for(int i = 0; i<char1.length ; i++) {for(int j = 0; j<char2.length; j++) {c[i][j] = a[i] * b[j];//将大整数一位一位相乘}}int k = 0;while(k < char1.length+char2.length-1) {for(int i = 0; i<char1.length; i++) {for(int j = 0; j<char2.length; j++) {if(i+j == k) {result[k] += c[i][j];}}}k++;}for(int i = char1.length+char2.length-1-1; i>0 ;i--) {if(result[i] > 9){result[i-1] += result[i] / 10;result[i] = result[i] % 10;}}return result;
}


③compare(String,String):boolean  // 因为①中包含了,所以在此解释一下

/*
字符串比较函数,比较两字符串长度大小
*/
public static boolean compare(String data1 , String data2) {int i = 0;if(data1.length() > data2.length()) {return false;}else {i = data1.compareTo(data2);if(i > 0) {return false;}else {return true;}}
}

备注:

    如果用Java自带类库写函数就很方便了,下面也一并附上自带类库所写程序。

import java.math.BigInteger;public class BigNumberLibrary {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubBigInteger a = new BigInteger("997945672345647898769");BigInteger b = new BigInteger("59164562345721340329");System.out.println("两大数运算结果为:");BigInteger c = a.add(b);BigInteger d = a.subtract(b);BigInteger e = a.multiply(b);BigInteger f = a.divide(b); // 若除数为0,程序会自动抛出异常BigInteger g = a.remainder(b);System.out.println(a + " + " + b + " = " + c);	System.out.println(a + " - " + b + " = " + d);System.out.println(a + " * " + b + " = " + e);System.out.println(a + " / " + b + " = " + f);System.out.println(a + " % " + b + " = " + g);}
}


结束语:

     自己的想法和代码如上,如果您觉得想法赞,或者对上述有不理解的地方,再或者有更好的想法,欢迎留言,大家相互交流提高。

     至于两大数的除法运算,自己将写在下一篇博客上。

 

这篇关于浅谈一下大数相乘有关思路(图解)与用java代码具体解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959304

相关文章

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Pandas透视表(Pivot Table)的具体使用

《Pandas透视表(PivotTable)的具体使用》透视表用于在数据分析和处理过程中进行数据重塑和汇总,本文就来介绍一下Pandas透视表(PivotTable)的具体使用,感兴趣的可以了解一下... 目录前言什么是透视表?使用步骤1. 引入必要的库2. 读取数据3. 创建透视表4. 查看透视表总结前言

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊