自己用Java实现的大整数加减乘除运算。还有可以改进的地方,有兴趣的童鞋可以加以改进。仅供参考,请勿转载!

package barrytest;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//@author Barry Wang
// all the four method have not considered the negative number yet.
// all the four method are implemented by manual calculate method.
public class BigIntegerOperation {
    public static void main(String[] age){
        String x="6465708680075747657477";
        String y="676894863054305436353";
       
        String a = add(x,y);
        System.out.println("1. x add y result is:"+a);
        String s = subtract(x,y);
        System.out.println("2. x subtract y result is:"+s);
        String m = multiply(x,y);
        System.out.println("3. x multiply y result is:"+m);
        List<String> d= divide(x,y);
        System.out.println("4. y divide x quotient is:"+d.get(0)+" reminder is:"+d.get(1));
    }
    //1. add----the method are implemented by manual calculate method.
    public static String add(String x,String y){  
        if(isNullAndNotNumber(x,y)){
            return null;
        }
       
        if(x.equals("0")){  
            return y;
        }
        if(y.equals("0")){  
            return x;
        }
          
        if(x.length()>y.length()){  
            String tmp=x;
            x=y;
            y=tmp;
        }
          
        x = addZeroToFirst(x,y.length());
        String z = addHelp(x,y);
        return z;
    }
   
    //2. subtract----the method are implemented by manual subtract calculate method.
    public static String subtract(String x, String y){
        if(isNullAndNotNumber(x,y)){
            return null;
        }
       
        if(x.equals("0")){
            return "-"+y;
        }
        if(y.equals("0")){  
            return x;
        }
       
        String sign = "";
       
        if(!isBig(x,y)){
            sign = "-";
            String tmp = x;
            x = y;
            y = tmp;
        }
       
        int len = x.length();
        int diffLen = len - y.length();
        for(int i=0; i<diffLen; i++){
            y = "0"+y;
        }
       
        int[] a = toIntArray(x);
        int[] b = toIntArray(y);
        int[] c = new int[len];
       
        int borrow = 0;
        int result = 0;
        int i = len-1;
        while(i >= 0){
            result = a[i] - b[i] + borrow;
            borrow = 0;
            if(result < 0){
                borrow = -1;
                result += 10;
            }
           
            c[i--] = result;
        }
      
        StringBuffer sb = new StringBuffer(32);
        for(int j=0; j<len; j++){
            if(c[j] == 0 && sb.length() == 0){
                continue;
            } else {
                sb.append(c[j]);
            }
        }
       
        return sign + sb.toString();
    }
   
    //3. multiply----the method are implemented by manual multiply calculate method.
    public static String multiply(String x, String y){
        if(isNullAndNotNumber(x,y)){
            return null;
        }
       
        if(x.equals("0") || y.equals("0")){
            return "0";
        }
       
        int[] a = toIntArray(x);
        int[] b = toIntArray(y);
       
        int[] temp1 = null;
        int[] temp2 = null;
       
        int enter = 0;
        int result = 0;
        int count = 1;
        for(int i=(b.length -1); i>=0; i--){
            temp1 = new int[a.length+(++count)];
            enter = 0;
            for(int j=a.length-1; j>=0; j--){
                result = a[j]*b[i]+enter;
                temp1[j+2] = result;
                enter = result/10;
            }
            temp1[1] = enter;
            temp1[0] = 0;
            temp2 = addIntArray(temp1, temp2);
        }
       
        StringBuffer sb = new StringBuffer(32);
        for(int j=0; j<temp2.length; j++){
            if(temp2[j] == 0 && sb.length() == 0){
                continue;
            } else {
                sb.append(temp2[j]);
            }
        }
       
        return sb.toString();
    }
   
    //4. divide----the method are implemented by manual divide calculate method.
    public static List<String> divide(String x, String y) {
        if(isNullAndNotNumber(x,y)){
            return null;
        }
       
        List<String> returnList = new ArrayList<String>();
        if(y.equals("0") || x.equals("0")){
            returnList.add("0");
            returnList.add("0");
            return returnList;
        }
       
        String quotient = "";//quotient
        String remainder = "";//remainder
        if (isBig(x, y) == false) {
            remainder = y;
            quotient = "0";
           
            returnList.add(quotient);
            returnList.add(remainder);
            return returnList;
        }
        int i = y.length();
        remainder = x.substring(0, i);
       
        do {
            for (int j = 9; j >= 1; j--) {
                if ((isBig(remainder, multiply(y, Integer.valueOf(j).toString())) == false) && (isBig(remainder, multiply(y, Integer.valueOf(j - 1).toString())) == true)) {
                    if((j-1) > 0){
                        quotient += (j-1);
                    }
                    remainder = subtract(remainder, multiply(y, Integer.valueOf(j-1).toString()));
                    break;
                }
            }
            int len = remainder.length();
            for (int k = 0; (k < y.length() - len) && (i < x.length()); k++) {
                remainder += x.charAt(i);
                i++;
                if (isBig(remainder, y) == false) {
                    quotient += "0";
                }
            }
            if ((isBig(remainder, y) == false) && (i < x.length())) {
                remainder += x.charAt(i);
                i++;
            }
        } while (i < x.length());
        for (int j = 9; j >= 1; j--) {
            if ((isBig(remainder, multiply(y, Integer.valueOf(j).toString())) == false) && (isBig(remainder, multiply(y, Integer.valueOf(j - 1).toString())) == true)) {
                if((j-1) > 0){
                    quotient += (j-1);
                }
                remainder = subtract(remainder, multiply(y, Integer.valueOf(j-1).toString()));
                break;
            }
        }
       
        returnList.add(quotient);
        returnList.add(remainder);
        return returnList;
    }
   
    private static boolean isNullAndNotNumber(String x, String y){
        if(x==null||y==null){
            return true;
        }
       
        if(!isNumeric(x)||!isNumeric(y)){
            return true;
        }
       
        return false;
    }
   
    //if x > y return true.
    private static boolean isBig(String x, String y){
        return (x.length() > y.length() || (x.length() == y.length() && x.compareTo(y) > 0));
    }
      
    public static String addHelp(String x,String y){  
        String z="";
        int len=x.length();
        int[] a=toIntArray(x);
        int[] b=toIntArray(y);
        int[] c=addIntArray(a, b);
       
        StringBuilder sb=new StringBuilder(32);
        for(int i=0;i<=len;i++){
            sb.append(c[i]);
        }
        if(c[0]==0){//delete the first '0' in result string
            z=sb.substring(1);
        }else{
            z=sb.toString();
        }
        return z;
    }
   
    // {2, 3, 4}+{6, 7} = {3, 0, 1}
    private static int[] addIntArray(int[] a, int b[]){
        if(a == null){
            return b;
        }
       
        if(b == null){
            return a;
        }
       
        if(a.length != b.length){//add "0" before the less length array.
            int[] temp = null;
            if(a.length < b.length){
                temp = a;
                a = b;
                b = temp;
            }
            temp = new int[a.length];
            for(int i=a.length-1, j=b.length-1; i>=0; i--){
                if(j>=0){
                    temp[i] = b[j--];
                }else{
                    temp[i] = 0;
                }
            }
            b = temp;
        }
       
       
        int len = a.length;
        int[] c=new int[len+1];
        int d=0;//to carry. No need to use int[]
        for(int i=0;i<len;i++){
            int tmpSum=a[len-1-i]+b[len-1-i]+d;
            c[len-i]=tmpSum;
            d=tmpSum/10;
        }
        c[0]=d;
       
        return c;
    }
      
 
    //String - toCharArray - toIntArray  
    public static int[] toIntArray(String str){
        int len=str.length();
        int[] result=new int[len];
        for(int i=0;i<len;i++){
            result[i]=str.charAt(i)-'0';
        }
        return result;
    }
      
    //("123",5)-->"00123"  
    public static String addZeroToFirst(String str,int length){  
        StringBuilder sb=new StringBuilder();
        int diff=length-str.length();
        while(diff>0){
            sb.append("0");
            diff--;
        }
        sb.append(str);
        return sb.toString();
    }
   
    public static boolean isNumeric(String str){  
        Pattern p=Pattern.compile("[0-9]*");
        Matcher isNum=p.matcher(str);
        return isNum.matches();
    }
}

Java 实现大整数加减乘除的更多相关文章

  1. 用Java的大整数类BigInteger来实现大整数的一些运算

    关于BigInteger的构造函数,一般会用到两个: BigInteger(String val); //将指定字符串转换为十进制表示形式: BigInteger(String val,int rad ...

  2. 基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

    大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 ...

  3. Java实现大整数乘法

    1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import java.math.BigInteger; publi ...

  4. java实现超大整数加减乘除四则运算

    原理: 用数组存储数字,按照计算法则进行运算. 代码: package com.hdwang; import java.util.regex.Matcher; import java.util.reg ...

  5. Java计算大整数

    import java.util.*; import java.math.*; //BigInteger类型在这个包里 public class Gcc_test { public static vo ...

  6. Coefficient Computation (大整数、Java解决)

    Coefficient Computation UVALive8265 题意:计算组合数C(n,k)的值并将值按给定的进制输出. 思路:Java大整数类硬上. PS:刚刚学完Java的大整数类,结果却 ...

  7. COJ 1211 大整数开平方

    手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用java的大整数得到答案 别人博客链接:http://www.cnblogs.com/Rinyo/archive/2012/12/16 ...

  8. POJ C++程序设计 编程题#1 大整数的加减乘除

    编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

  9. 自己动手写Java大整数《3》除法和十进制转换

    之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...

随机推荐

  1. 在React+Babel+Webpack环境中使用ESLint

    ESLint是js中目前比较流行的插件化的静态代码检测工具.通过使用它可以保证高质量的代码,尽量减少和提早发现一些错误.使用eslint可以在工程中保证一致的代码风格,特别是当工程变得越来越大.越来越 ...

  2. PHP常用之封装分页工具类

    分页基本上是每个项目都会使用到的,所以呢,把它封装成一个工具类,以后直接调用就可以了(虽然TP框架的灰常强大,但是自己封一个也未尝不可.),这样既省时又省力还赚'工分'. 我封的这个分页工具类还比较完 ...

  3. 七、rdd究竟是什么

    RDD是个抽象类,定义了诸如map().reduce()等方法,但实际上继承RDD的派生类一般只要实现两个方法: def getPartitions: Array[Partition] def com ...

  4. 五、RDD持久化

    Spark最重要的一个功能是它可以通过各种操作(operations)持久化(或者缓存)一个集合到内存中.当你持久化一个RDD的时候,每一个节点都将参与计算的所有分区数据存储到内存中,并且这些数据可以 ...

  5. jQuery.cssHooks

    概述 直接向 jQuery 中添加钩子,用于覆盖设置或获取特定 CSS 属性时的方法,目的是为了标准化 CSS 属性名或创建自定义属性. $.cssHooks 对象提供了一种通过定义函数来获取或设置特 ...

  6. MATLAB的符号运算基础

    在数学运算中,运算的结果如果是一个数值,可以称这类运算为数值运算:如果运算结果为表达式,在MATLAB中称为符号运算,符号计算是对未赋值的符号对象(可以是常数.变量.表达式)进行运算和处理.MATLA ...

  7. MyBatis-Generator 逆向工程(生成异常缺少部分的方法)

    今日在使用 MyBatis-Generator 逆向工程时遇到了生成 mapper.java  , mapper.xml  时缺少部分方法. 正常的 Mapper.java 示例: public in ...

  8. Python学习笔记——基础篇【第六周】——Subprocess模块

    执行系统命令 可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 com ...

  9. [SQL基础教程] 2-3 逻辑运算符

    [SQL基础教程] 2-3 逻辑运算符 NOT AND OR 优先级 ( )改变优先级 AND 优先级高于 OR NULL 引入三值逻辑

  10. 基于AFN的多张图片上传

    不废话,直接上代码 NSString *urlString = [NSString stringWithFormat:@"http://192.168.1.166:8080/Discipli ...