前言

在日常的算法练习中难免会遇见涉及阶乘的计算的题目,总所周知阶乘的数据会变得非常大,此时int和long型都装不下只能借助于String来表示,所以这里特为大家提供两种解决方案:1、使用Java API中的BigInteger类,该类中提供加(add())、减(subtract())、乘(multiply())、除(divid())的成员方法,我们可以通过这四种成员方法来进行我们的大整数运算。2、由于我们在计算中常用的是大整数加法和大整数乘法运算,所以我们可以自己构造相应的方法来实现我们的计算目的。

一、借助Java API---BigInteger类

示例程序如下

import java.math.BigInteger;

public class Main{

public static void main(String[] args) {

BigInteger bi1 = new BigInteger("123456789");//乘数1

BigInteger bi2 = new BigInteger("123456789");//乘数2

//public BigInteger add(BigInteger val):加

System.out.println("add:"+bi1.add(bi2));

//public BigInteger multiply(BigInteger val):乘

System.out.println("multiply:"+bi1.multiply(bi2));

}

}

二、构造大整数乘法和加法运算的方法

大整数加法运算方法

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

if(a.length() <= 8 && b.length() <= 8){

return Integer.parseInt(a) + Integer.parseInt(b) + "";

}

String a1 = "0";

String a2 = a;//低八位

if(a.length() > 8){

a1 = a.substring(0,a.length()-8);

a2 = a.substring(a.length()-8);

}

String b1 = "0";

String b2 = b;//低八位

if(b.length() > 8){

b1 = b.substring(0,b.length()-8);

b2 = b.substring(b.length()-8);

}

String t = add(a2,b2);//低八位相加和

if(t.length() > 8) return add(add(a1,b1),"1") + t.substring(1);

while(t.length() < 8) t = "0" + t;//低八位相加和不够八位时,在前面补零

return add(a1,b1) + t;

}

大整数乘法运算方法

public static String muti(String s1,String s2){

if(s1.length() <= 4 && s2.length() <= 4){//当两个乘数均小于4位时,直接计算就可以了

return Integer.parseInt(s1) * Integer.parseInt(s2) + "";

}

if(s1.length() > 4){//当s1位数超过4位时,将s1一分为二

int k = s1.length() / 2;//保存s1被分割位置的下表

String a1 = s1.substring(0,k);//s1的高位

String a2 = s1.substring(k);//s1的低位

return add(muti(a1,s2)+zero(a2.length()),muti(a2,s2));//高位与s2相乘在其后补上s2的长度个零在与低位与s2相乘的结果相加

}

return muti(s2,s1);//当s2的长度超过4时,将s2与s1的位置对调求解

}

注:补零算法zero(int k)实现代码如下

public static String zero(int k){

if(k == 0) return "";

if(k == 1) return "0";

int m = k / 2;

int n = k % 2;

return zero(m) + zero(m) + zero(n);//利用m + m + n = k

}

java 中 如何sum 乘法_JAVA中解决大数乘法和加法问题相关推荐

  1. java为什么要用反射_Java中为什么需要反射?反射要解决什么问题?

    一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...

  2. java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。

    方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...

  3. java如何使截取字符串_java中如何截取字符串中的指定一部分

    java中如何截取字符串中的指定一部分 关注:136  答案:4  mip版 解决时间 2021-02-06 13:27 提问者妳涐執唸汰深 2021-02-06 08:56 精选 比如 F:\wor ...

  4. java中什么是空指针异常_JAVA中的空指针异常如何处理?

    你这个问题的解决 问题定位: 在堆栈异常信息的第一行就可以定位到是哪里出了空指针,倘若这里不是你写的类,可以往下翻一下,找到你写的类,就是这里出现的空指针. 问题解决: 对一个空对象调用里面的方法或者 ...

  5. java中 enum什么意思_Java中“enum”的用途是什么?

    本问题已经有最佳答案,请猛点这里访问. 所以我研究了这个"枚举"类型,在我看来它有点像一个美化的数组/ArrayList/List.它的具体用途是什么? 你觉得它是以什么样的方式排 ...

  6. java中的vm自变量_java中JVM虚拟机内存模型详细说明

    java中JVM虚拟机内存模型详细说明 JVM的内部结构如下图: 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求 ...

  7. java父类声明子类实现_java中父类声明子类实例化

    问题: 1.比如两个类父类:Person 子类 Student extends Person在使用时候,这样写:Person person=null; //声明对象person=new Student ...

  8. java int转无符号_Java 中使用无符号整型(unsigned int)的使用方法

    背景 计算机科班出身大多学过离散数学,或者理工类专业也大多学习过 C 或 C++ 语言,从中我们了解到基本类型的整形有 short.int.long 等,还分别有无符号(unsigned)和带符号(s ...

  9. java中组件与容器_java中的容器组件和非容器组件

    1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...

  10. java boolean几个字节_Java中boolean类型到底占用多少个字节?

    1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...

最新文章

  1. JAVA中的接口和抽象类的区别
  2. MVC 中的 ViewModel
  3. 第十章 springboot + logback
  4. 浅谈Struts2和Sturts1的区别
  5. 笔记-信息系统开发基础-CMMI过程域分类-连续式的模型
  6. boost::undirected_dfs用法的测试程序
  7. Android 中的 Context
  8. J-Rooms及时会议室 v4.5.5333.1104
  9. oracle dblink使用
  10. FLEX 2.01 全套下载!
  11. postman访问abp接口因cookies问题导致400错误
  12. JVM监控及诊断工具命令行篇之jhat
  13. 计算机添加定时启动软件,有什么软件可以让电脑定时开机?除了设定BIOS!
  14. 计算机无线键盘没反应,电脑连接无线键盘没反应怎么办
  15. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化
  16. 移动平台端到端低成本解决方案
  17. C语言入门(一):基础语法
  18. python给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
  19. Redis与传统sql数据库的区别
  20. 苹果手机如何一键备份手机里的照片和视频?

热门文章

  1. 求助!!VC++6.0出现error c2660
  2. 从零开始编写Web自动化测试脚本(一)--Selenium+WebDriver环境搭建
  3. 【Unity踩坑记录】导航系统NavMeshAgent
  4. ubuntu18.04 如何设置固定IP
  5. android sdk 4.0 安装,Android SDK 4.0.3 安装教程
  6. c语言使用iconv函数实现字符编码转换
  7. 用户画像基础之用户画像是什么
  8. 【Android】[1]APP桌面图标和显示名字国际化
  9. 苹果a7处理器_研发了A7到A12全部处理器的芯片大牛:被苹果告倒
  10. c++程序设计 计蒜客 抢气球