Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java实现乘法算法_Java_Algorithm_Biginteger_Multiplication - Fatal编程技术网

用java实现乘法算法

用java实现乘法算法,java,algorithm,biginteger,multiplication,Java,Algorithm,Biginteger,Multiplication,我尝试使用Java实现以下乘法算法: m:数字是多少 n:是b的位数 β:是基础吗 这是实现此算法的java函数: public BigInteger prodbigbig(BigInteger a, BigInteger b, Integer base ){ ArrayList<Integer> listA = new ArrayList<Integer>(); ArrayList<Integer> listB = ne

我尝试使用Java实现以下乘法算法:

m:数字是多少

n:是b的位数

β:是基础吗

这是实现此算法的java函数:

public BigInteger prodbigbig(BigInteger a, BigInteger b, Integer base ){

        ArrayList<Integer> listA = new ArrayList<Integer>();
        ArrayList<Integer> listB  = new ArrayList<Integer>();
        ArrayList<Integer> listC = new ArrayList<Integer>();
        int m = a.toString().length();
        int n = b.toString().length();
        Integer carry, temp;
        BigInteger result = BigInteger.ZERO;

        for(int i = 0; i < a.toString().length(); i++){
            listA.add(Character.getNumericValue( a.toString().charAt(i)));
        }
        for(int i = 0; i < b.toString().length(); i++){
            listB.add((Character.getNumericValue( b.toString().charAt(i))));
        }
        for(int i= 0; i <= m - 1; i++){
            listC.add(0);
        }

        for(int k = 0; k <= n - 1 ; k++) {
            carry = 0;
            for(int  i = 0; i <= m - 1; i++){
                temp = (listA.get(i) * listB.get(k)) + listC.get(i + k) + carry;
                listC.add(i+k,temp % base);
                carry = temp / base;
            }
            listC.add(k + m,carry);
        }
        for(int i = 0; i < m + n; i++) {
            result = result.add(BigInteger.valueOf((long) (listC.get(i)*(Math.pow(base, i)))));
        }

        return result;
    }
public biginger prodbigbig(biginger a、biginger b、整数基){
ArrayList listA=新的ArrayList();
ArrayList listB=新的ArrayList();
ArrayList listC=新的ArrayList();
int m=a.toString().length();
int n=b.toString().length();
整数进位,温度;
BigInteger结果=BigInteger.0;
for(int i=0;i
listC.set(i+k,temp % base);
最后一次到BigInteger的转换将溢出足够大的数字。我将完全去掉
ArrayList
,使用
int
数组,然后在最后将其转换为
byte[]
,并将其直接提供给
BigInteger的构造函数。

那应该是

listC.set(i+k,temp % base);

最后一次到BigInteger的转换将溢出足够大的数字。我将完全去掉
ArrayList
,使用
int
数组,然后将其转换为
byte[]
结尾,并将其直接输入到
biginger的构造函数。

看起来您应该使用
set
而不是在listC中使用
add
,因为add(index,value),在index之后移动其他元素,但是
set
被替换

public BigInteger prodbigbig(BigInteger a, BigInteger b, Integer base ){

        ArrayList<Integer> listA = new ArrayList<Integer>();
        ArrayList<Integer> listB  = new ArrayList<Integer>();
        ArrayList<Integer> listC = new ArrayList<Integer>();
        int m = a.toString().length();
        int n = b.toString().length();
        Integer carry, temp;
        BigInteger result = BigInteger.ZERO;

        for(int i = 0; i < a.toString().length(); i++){
            listA.add(Character.getNumericValue( a.toString().charAt(i)));
        }
        for(int i = 0; i < b.toString().length(); i++){
            listB.add((Character.getNumericValue( b.toString().charAt(i))));
        }
        for(int i= 0; i <= m - 1; i++){
            listC.add(0);
        }

        for(int k = 0; k <= n - 1 ; k++) {
            carry = 0;
            for(int  i = 0; i <= m - 1; i++){
                temp = (listA.get(i) * listB.get(k)) + listC.get(i + k) + carry;
                listC.set(i+k,temp % base);
                carry = temp / base;
            }
            listC.set(k + m,carry);
        }
        for(int i = 0; i < m + n; i++) {
            result = result.add(BigInteger.valueOf((long) (listC.get(i)*(Math.pow(base, i)))));
        }

        return result;
    }
public biginger prodbigbig(biginger a、biginger b、整数基){
ArrayList listA=新的ArrayList();
ArrayList listB=新的ArrayList();
ArrayList listC=新的ArrayList();
int m=a.toString().length();
int n=b.toString().length();
整数进位,温度;
BigInteger结果=BigInteger.0;
for(int i=0;i对于(int i=0;i看起来应该在listC中使用
set
而不是
add
,因为add(index,value)在index之后移动其他元素,但是
set
被替换

public BigInteger prodbigbig(BigInteger a, BigInteger b, Integer base ){

        ArrayList<Integer> listA = new ArrayList<Integer>();
        ArrayList<Integer> listB  = new ArrayList<Integer>();
        ArrayList<Integer> listC = new ArrayList<Integer>();
        int m = a.toString().length();
        int n = b.toString().length();
        Integer carry, temp;
        BigInteger result = BigInteger.ZERO;

        for(int i = 0; i < a.toString().length(); i++){
            listA.add(Character.getNumericValue( a.toString().charAt(i)));
        }
        for(int i = 0; i < b.toString().length(); i++){
            listB.add((Character.getNumericValue( b.toString().charAt(i))));
        }
        for(int i= 0; i <= m - 1; i++){
            listC.add(0);
        }

        for(int k = 0; k <= n - 1 ; k++) {
            carry = 0;
            for(int  i = 0; i <= m - 1; i++){
                temp = (listA.get(i) * listB.get(k)) + listC.get(i + k) + carry;
                listC.set(i+k,temp % base);
                carry = temp / base;
            }
            listC.set(k + m,carry);
        }
        for(int i = 0; i < m + n; i++) {
            result = result.add(BigInteger.valueOf((long) (listC.get(i)*(Math.pow(base, i)))));
        }

        return result;
    }
public biginger prodbigbig(biginger a、biginger b、整数基){
ArrayList listA=新的ArrayList();
ArrayList listB=新的ArrayList();
ArrayList listC=新的ArrayList();
int m=a.toString().length();
int n=b.toString().length();
整数进位,温度;
BigInteger结果=BigInteger.0;
for(int i=0;i对于(int i=0;i我通过以下方式解决了修改代码的问题:

public BigInteger prodBigBig(BigInteger a, BigInteger b, int base ){

            BigInteger result = BigInteger.ZERO;

            if(a.compareTo(result) == 0 || b.compareTo(result) == 0)
                return result;

            int m = a.toString().length();
            int n = b.toString().length();
            int carry;
            int temp;
            ArrayList<Integer>listA = new ArrayList<>();
            ArrayList<Integer>listB = new ArrayList<>();
            int[] listC = new int[m + n];

            for(int i = m - 1; i >= 0; i--){
                listA.add(Character.getNumericValue( a.toString().charAt(i)));
                listC[i] = 0;
            }

            for(int i = n - 1; i >= 0; i--) {
                listB.add(Character.getNumericValue(b.toString().charAt(i)));
            }

            for(int k=0; k < n; k++) {
                carry = 0;
                for(int i = 0; i < m ; i++){
                    temp = (listA.get(i) * listB.get(k)) + listC[i + k] + carry;
                    listC[i + k] = temp % base;
                    carry = temp / base;
                }
                listC[k + m] = carry;
            }

            for(int i= 0; i < m + n; i++){
                result = result.add(BigInteger.valueOf((long) (listC[i] * Math.pow(base, i))));
            }
            return result;

    }
public biginger prodBigBig(biginger a,biginger b,int base){
BigInteger结果=BigInteger.0;
如果(a.compareTo(结果)==0 | | b.compareTo(结果)==0)
返回结果;
int m=a.toString().length();
int n=b.toString().length();
整数进位;
内部温度;
ArrayListA=新的ArrayList();
ArrayListB=新的ArrayList();
int[]listC=新的int[m+n];
对于(int i=m-1;i>=0;i--){
add(Character.getNumericValue(a.toString().charAt(i));
listC[i]=0;
}
对于(int i=n-1;i>=0;i--){
add(Character.getNumericValue(b.toString().charAt(i));
}
对于(int k=0;k
我通过以下方式解决了修改代码的问题:

public BigInteger prodBigBig(BigInteger a, BigInteger b, int base ){

            BigInteger result = BigInteger.ZERO;

            if(a.compareTo(result) == 0 || b.compareTo(result) == 0)
                return result;

            int m = a.toString().length();
            int n = b.toString().length();
            int carry;
            int temp;
            ArrayList<Integer>listA = new ArrayList<>();
            ArrayList<Integer>listB = new ArrayList<>();
            int[] listC = new int[m + n];

            for(int i = m - 1; i >= 0; i--){
                listA.add(Character.getNumericValue( a.toString().charAt(i)));
                listC[i] = 0;
            }

            for(int i = n - 1; i >= 0; i--) {
                listB.add(Character.getNumericValue(b.toString().charAt(i)));
            }

            for(int k=0; k < n; k++) {
                carry = 0;
                for(int i = 0; i < m ; i++){
                    temp = (listA.get(i) * listB.get(k)) + listC[i + k] + carry;
                    listC[i + k] = temp % base;
                    carry = temp / base;
                }
                listC[k + m] = carry;
            }

            for(int i= 0; i < m + n; i++){
                result = result.add(BigInteger.valueOf((long) (listC[i] * Math.pow(base, i))));
            }
            return result;

    }
public biginger prodBigBig(biginger a,biginger b,int base){
BigInteger结果=BigInteger.0;
如果(a.compareTo(结果)==0 | | b.compareTo(结果)==0)
返回结果;
int m=a.toString().length();
int n=b.toString().length();
整数进位;
内部温度;
ArrayListA=新的ArrayList();
ArrayListB=新的ArrayList();
int[]listC=新的int[m+n];
对于(int i=m-1;i>=0;i--){
add(Character.getNumericValue(a.toString().charAt(i));
listC[i]=0;
}
对于(int i=n-1;i>=0;i--){
add(Character.getNumericValue(b.toString().charAt(i));
}
对于(int k=0;k