将bigInteger值添加到2d数组

时间:2015-12-21 17:32:19

标签: java arrays integer biginteger

下面的代码不起作用,因为它使用模数进行负数计算。所以我必须将值解析为声明为BigInteger的2d数组而不是int。

BigInteger  bi2, bi3;
    int det=(key[0][0] * key[1][1])-(key[0][1] * key[1][0]);

    BigInteger  bi1 = new BigInteger(String.valueOf(det));
    bi2 = new BigInteger("26");
    bi3 = bi1.modInverse(bi2);
    int inverse= bi3.intValue();
    key[0][0] = inverse * key[0][0];
    key[0][1] = inverse * key[0][1];
    key[1][0] = inverse * key[1][0];
    key[1][1] = inverse * key[1][1];

    key2[0][0] = key[1][1];
    key2[1][1] = key[0][0];
    key2[0][1] = -key[0][1];
    key2[1][0] = -key[1][0];

问题在于: 它为每个计算打印错误答案,因为它需要使用o BigInteger而不是inetger因为负值。

key[0][0] = key2[0][0] % 26;
key[0][1] = key2[0][1] % 26;
key[1][0] = key2[1][0] % 26;
key[1][1] = key2[1][1] % 26;    

此后,我想用这个BigIntegers进行一些计算。但是,计算将仅包括整数。所以在那之后我必须将数组中的那些BigIntegers转换为整数。

其余代码:

for (int i = 0; i < str.length(); i++) {
        for (int j =0; j<  alphabet.size() ; j++){
            if (alphabet.get(j) == str.charAt(i)) {
                    int index = alphabet.indexOf(str.charAt(i));
                    store.add(index);
            }
        }
    }
    System.out.println(Arrays.toString(store.toArray()));

    for (; k<store.size(); k++){
            sp2 = sp +1;
            int n2=0;
            int n1 = 0;
            if (sp==store.size()-1){
                n1 = store.get(sp);
                if (sp2> store.size()-1){
                  n2 = 23;  
                }
                if(sp2 < store.size()) {
                    n2 = store.get(sp2);
                }
                fn1 = ((key[0][0] * n1) + (key [0][1] * n2))% 26;
                fn2 = ((key[1][0] * n1) + (key [1][1] * n2))%26;
                conversion.add(fn1);
                conversion.add(fn2);
                sp+=2;
            }
            if (sp > store.size() -1){
                    break;
                }
            else{
                n1 = store.get(sp);
                n2 = store.get(sp2);
                fn1 = ((key[0][0] * n1) + (key [0][1] * n2))% 26;
                fn2 = ((key[1][0] * n1) + (key [1][1] * n2))%26;
                conversion.add(fn1);
                conversion.add(fn2);
                sp+=2;
            }           
    } 
    System.out.println(Arrays.toString(conversion.toArray()));

    List<Character> encrypted = new ArrayList();

    for (int i=0; i<conversion.size(); i++){
        int num = conversion.get(i);
        char letter = alphabet.get(num);
        encrypted.add(letter);
    }
    System.out.println(Arrays.toString(encrypted.toArray()));

错误消息:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:-8

错误是这样的(结束前4行):     char letter = alphabet.get(num);

1 个答案:

答案 0 :(得分:1)

对于那些有数学背景的人来说,这是一个令人惊讶的特征

 System.out.println("=" + (-3 % 4));
例如,

返回-3而不是1(将在[0,3]范围内);

编辑:

换句话说,错误信息

error message: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -8

最终由(n%m)引起的可以返回负值。像

这样的陈述
num=(26+num)%26;

会治愈它。