Java大整数遇到的问题

Java大整数遇到的问题

最近做了一道题目涉及到(17591026060782+2)*17591026060781/2这样的计算,于是我就开始打算用java来计算,但是遇到了一些问题,如下:

  1. java中的整数范围
  2. 如何计算大整数乘法
  3. 如何计算大整数加法
  4. for循环中遇到的大整数问题
  5. 最后没有java,跑不动,用了python

1. java中的整数范围

byte的取值范围为-128~127,占用1个字节(-27次方到27次方-1short的取值范围为-32768~32767,占用2个字节(-215次方到215次方-1int的取值范围为(-2147483648~2147483647),占用4个字节(-231次方到231次方-1long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-263次方到263次方-1

2.计算大整数乘法

我将大整数乘法化为大整数加法,这个过程就需要解决两个问题,分别见3,4

3.计算大整数加/减法

代码如下:主要参考加法和减法的两个函数

public class AddSub{

    public static void main(String[] args) {
        String b="140728208486248";
        String a="140728208486248";
        //17591026060781
        int []pa=stringToInts(a);
        int []pb=stringToInts(b);
        String ans=add(pa, pb);
        //String ans_sub=sub(pb,pa);
        //System.out.println(ans_add);
        //System.out.println(ans_sub);
        //8795513030392
        for(long i=0;i<1099439128799L;i++){
            int[] sum=stringToInts(ans);
            ans=add(sum,pa);
            //System.out.println(i);
        }
        System.out.println(ans);

    }

    public static int[] stringToInts(String s){
        int[] n = new int[s.length()]; 
        for(int i = 0;i<s.length();i++){
        n[i] = Integer.parseInt(s.substring(i,i+1));
        }
        return n;
    }

    public static String add(int []a,int []b){
        StringBuffer sb=new StringBuffer();
        int a_len=a.length-1;
        int b_len=b.length-1;
        int jinwei=0;
        while(a_len>=0||b_len>=0){
            int temp=0;
            if(a_len>=0&&b_len>=0){
                temp=a[a_len]+b[b_len]+jinwei;
            }else if(a_len>=0){
                temp=a[a_len]+jinwei;
            }else if(b_len>=0){
                temp=b[b_len]+jinwei;
            }
            sb.append(temp%10+"");
            jinwei=temp/10;
            a_len--;b_len--;
        }
        sb.append(jinwei);
        return getNum(sb.reverse());
    }

    /*
    public static String sub(int []a,int []b){
        StringBuffer sb=new StringBuffer();
        boolean flag=false;
        if(a.length<b.length){
            int c[]=a;
            a=b;b=c;
            flag=true;
        }
        int a_len= a.length-1;
        int b_len=b.length-1;
        int jiewei=0;
        while(a_len>=0||b_len>=0){
            int temp=0;
            if(a_len>=0&&b_len>=0){
                if((a[a_len]-jiewei)<b[b_len]){
                    temp=a[a_len]+10-b[b_len]-jiewei;
                    jiewei=1;
                }else{
                    temp=a[a_len]-b[b_len]-jiewei;
                }
            }else if(a_len>=0){
                temp=a[a_len]-jiewei;
                jiewei=0;
            }
            sb.append(temp+"");

            a_len--;b_len--;
        }
        if(flag){
            return getNum(sb.append("-").reverse());
        }
        return getNum(sb.reverse());
    }*/

    public static String getNum(StringBuffer sb){
        while(sb.length() > 1 && sb.charAt(0) == '0') {
            sb.deleteCharAt(0);
        }
        return sb.toString();
    }

}
public class AddSub{

    public static void main(String[] args) {
        String b="140728208486248";
        String a="140728208486248";
        //17591026060781
        int []pa=stringToInts(a);
        int []pb=stringToInts(b);
        String ans=add(pa, pb);
        //String ans_sub=sub(pb,pa);
        //System.out.println(ans_add);
        //System.out.println(ans_sub);
        //8795513030392
        for(long i=0;i<1099439128799L;i++){
            int[] sum=stringToInts(ans);
            ans=add(sum,pa);
            //System.out.println(i);
        }
        System.out.println(ans);

    }

    public static int[] stringToInts(String s){
        int[] n = new int[s.length()]; 
        for(int i = 0;i<s.length();i++){
        n[i] = Integer.parseInt(s.substring(i,i+1));
        }
        return n;
    }

    public static String add(int []a,int []b){
        StringBuffer sb=new StringBuffer();
        int a_len=a.length-1;
        int b_len=b.length-1;
        int jinwei=0;
        while(a_len>=0||b_len>=0){
            int temp=0;
            if(a_len>=0&&b_len>=0){
                temp=a[a_len]+b[b_len]+jinwei;
            }else if(a_len>=0){
                temp=a[a_len]+jinwei;
            }else if(b_len>=0){
                temp=b[b_len]+jinwei;
            }
            sb.append(temp%10+"");
            jinwei=temp/10;
            a_len--;b_len--;
        }
        sb.append(jinwei);
        return getNum(sb.reverse());
    }

    /*
    public static String sub(int []a,int []b){
        StringBuffer sb=new StringBuffer();
        boolean flag=false;
        if(a.length<b.length){
            int c[]=a;
            a=b;b=c;
            flag=true;
        }
        int a_len= a.length-1;
        int b_len=b.length-1;
        int jiewei=0;
        while(a_len>=0||b_len>=0){
            int temp=0;
            if(a_len>=0&&b_len>=0){
                if((a[a_len]-jiewei)<b[b_len]){
                    temp=a[a_len]+10-b[b_len]-jiewei;
                    jiewei=1;
                }else{
                    temp=a[a_len]-b[b_len]-jiewei;
                }
            }else if(a_len>=0){
                temp=a[a_len]-jiewei;
                jiewei=0;
            }
            sb.append(temp+"");

            a_len--;b_len--;
        }
        if(flag){
            return getNum(sb.append("-").reverse());
        }
        return getNum(sb.reverse());
    }*/

    public static String getNum(StringBuffer sb){
        while(sb.length() > 1 && sb.charAt(0) == '0') {
            sb.deleteCharAt(0);
        }
        return sb.toString();
    }

}

4.for循环中遇到的问题

for(long i=0;i<1099439128799;i++)

这里报错,中间那个数字越界了,但是我明明定义的i是long型,为什么会越界。请教别人之后,才发现定义的是i而和后边的那个大数没有关系,后边那个数字后应加上l(L)。

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/lee_ham/article/details/77287788
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞