java BigInteger实现

BigInteger底层是用int[]实现的。

之前看数据结构,一直以为BigInteger是用链表实现的。但后来发现那只是练习时增加难度所用。

之后发现用String实现比链表不知道快了多少倍。就以为是用String实现。

可是一查,才发现原来使用int[]实现的。

是啊,用int[]就省去了字符转数字的麻烦!

下面给出用String实现的加和乘算法。思路和我们手算是一样的。

 public String mulOneDigit(String num1, char digit, int level){
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i = num1.length()-1; i >= 0 || carry != 0;  i--){
            int tmp = i < 0 ? 0 : num1.charAt(i) - ‘0‘;
            sb.insert(0, (tmp * (digit-‘0‘) + carry) % 10);
            carry = (tmp * (digit-‘0‘) + carry) / 10;
        }
        while (level > 0){
            sb.append(0);
            level--;
        }
        return sb.toString();
    }

  /**
     * 用 ?: 来规避两段循环,并注意最高位进一的情况
     * @param num1
     * @param num2
     * @return
     */
    public String add(String num1, String num2){
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i = num1.length() - 1, j = num2.length() - 1;  i >= 0 || j>=0 || carry != 0; i--, j--){
            int a = i < 0 ? 0 : num1.charAt(i) - ‘0‘;
            int b = j < 0 ? 0 : num2.charAt(j) - ‘0‘;
            sb.insert(0, (a+b+carry) % 10);
            carry = (a+b+carry)/10;
        }
        return sb.toString();
    }

    public String multiply(String num1, String num2) {
        String small, large;
        if (num1.length() > num2.length()){
            large = num1;
            small = num2;
        }else {
            large = num2;
            small = num1;
        }
        List<String> stringList = new ArrayList<>();
        int level = 0;
        for (int i = small.length()-1; i >= 0 ; i--) {
            stringList.add(mulOneDigit(large, small.charAt(i), level++));
        }
        String result = "0";
        for (String str : stringList){
            result = add(str, result);
        }
        if (result.charAt(0) == ‘0‘){
            result = "0";
        }
        return result;

    }

  

时间: 2024-08-28 23:45:08

java BigInteger实现的相关文章

大数运算之 Java BigInteger 的基本用法

大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInteger 提供了高精度的基本运算,因此竞赛中常用 Java 解决高精度运算问题. 当然如果比赛支持 python 就当我没说. BigInteger 对象的创建 BigInteger 类在 java.math.BigInteger 包中,首先引用该包. import java.math.BigInt

Java BigInteger类

1 package demo04; 2 3 import java.math.BigInteger; 4 5 //超过long型的整数, 封装成BigInteger类型的对象 6 public class BigIntegerDemo { 7 public static void main(String[] args) { 8 //构造方法 9 BigInteger b = new BigInteger("11111111111111111111111111111111111111111111&

java BigInteger源码学习

转载自http://www.hollischuang.com/archives/176 在java中,有很多基本数据类型我们可以直接使用,比如用于表示浮点型的float.double,用于表示字符型的char,用于表示整型的int.short.long等.但是,拿整数来说,如果我们想要表示一个非常大的整数,比如说超过64位,那么能表示数字最大的long也无法存取这样的数字时,我们怎么办.以前的做法是把数字存在字符串中,大数之间的四则运算及其它运算都是通过数组完成.JDK也有类似的实现,那就是Bi

java BigInteger类的用法

import java.math.BigInteger; 1.新建一个对象 Scanner in = new Scanner(System.in); BigInteger x1 = new BigInteger("-11"); //新建一个对象 BigInteger x2 = in.nextBiginteger();//键盘输入 BigInteger y = x1.abs(); //取绝对值 BigInteger y2 = x1.add(y); //x+y int x3 = y.com

有理数类 Java BigInteger实现

import java.math.BigInteger; public class Rational extends Number implements Comparable { private BigInteger numerator;// 分子 private BigInteger denominator;// 分母 /** * @param args */ public static void main(String[] args) { // TODO Auto-generated met

java BigInteger

用Java来处理高精度问题,相信对很多ACMer来说都是一件很happy的事,简单易懂.用Java刷了一些题,感觉Java还不错,在处理高精度和进制转换中,调用库函数的来处理.下面是写的一些Java中一些基本的函数的及其…… 头文件:import java.io.*; import java.util.*; import java.math.*; 读入: Scanner cin = Scanner (System.in); while(cin.hasNext())//等价于!=EOF n=cin

Java BigInteger类知识点总结

(1)程序有时需要处理大整数,java.math包中的BigInteger类提供任意精度的整数运算,可以使用构造方法: public BigInteger(String VAL)构造一个十进制的BigInteger对象,该构造方法可以发生NumberFormatException异常,也就是说,字符串参数VAL中如果含有非数字字符就会发生NumberFormatException异常. (2)BigInteger类的常用方法: public BigInteger add(BigInteger v

java BigInteger BigDicimal例题

需要import  java.math.*; BigInteger: add(BigInteger val);               + subtract(BigInteger val);        - multiply(BigInteger val);         * divide(BigInteger val);            / remainder(BigInteger val);    % compareTo(BigInteger val)     <返回-1   

20165211 2017-2018-2 《Java程序设计》第6周学习总结

20165211 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 本周,我学习了书本上第八.十五两章的内容,以下是我整理的主要知识. 第八章 常用实用类 String类 构造String对象 常量对象:"你好","12.97","boy",String常量也是对象,所以也有自己的引用和对象. String对象: ````String s = new String("we are students