0

私は次のコードを書きました:

public String alphabets = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#$%";

public Integer findBase(String input) {
    int i = 0;

    Integer base = 0;

    Integer temp = 0;

    while (i != input.length()) {
        temp = alphabets.indexOf(input.charAt(i)) + 1;
        if (temp > base) {
            base = temp;
        }
        i ++;

    }

    public String convert(String input, Integer to_base, Integer from_base) {
        int i;

        Long base_ten = 0L;

        Integer input_base = 0;

        // If specified, then consider that base as input from base, or else,
            //  calculate the base of the number

        if (from_base == 0) {
            input_base = findBase(input);
            } else {
                input_base = from_base;
            }

            Integer power = 0;
            Double temp_power = 0.0;

            while (!input.equals("")) {

                temp_power = Math.pow(input_base, power);
                base_ten = base_ten +  alphabets.indexOf(input.charAt(input.length() - 1)) * temp_power.intValue();
                input = input.substring(0, input.length() - 1);
                power = power + 1;
            }

            Long rem = 0L;

            String result = "";

            while (base_ten != 0L) {
                rem = base_ten % to_base;
                base_ten = base_ten / to_base;

                result = result + alphabets.charAt(rem.intValue());
            }

            String reverse = new StringBuffer(result).reverse().toString();

            return reverse;
        }

上記のコードを使用すると、"suchin" (ベース 31) などの文字列を他のベースに変換できます。しかし、「そのような」など、より大きなものを使用するたびに、上記のコードの次の行で例外が発生します。

result = result + alphabets.charAt(rem.intValue());

インデックスが-1だと言っています。もう少し掘り下げてみると、 rem.intValue() が何らかの大きな値に対して負 (-1) になっているように感じました。これを解決する方法がわかりません。Javaで大きな数の基数を変換する方法はありますか?

コードの BigInteger バージョンは次のとおりです。

public String convert(String input, BigInteger to_base, BigInteger from_base) {
    int i;

    BigInteger base_ten = new BigInteger("0");

    BigInteger input_base = new BigInteger("0");
    if (from_base.equals(BigInteger.valueOf(0))) {
         input_base = BigInteger.valueOf(findBase(input));
     } else {
        input_base = from_base;
    }

    BigInteger power = new BigInteger("0");

    BigInteger temp_power = new BigInteger("0");
    BigInteger to_add = new BigInteger("0");

    while (!input.equals("")) {
        temp_power = input_base.pow(power.intValue());
        to_add =  BigInteger.valueOf(alphabets.indexOf(input.charAt(input.length() - 1)));
        to_add = to_add.multiply(temp_power);

        base_ten = base_ten.add(to_add);
         input = input.substring(0, input.length() - 1);
         power = power.add(BigInteger.valueOf(1));
    }

    BigInteger rem = new BigInteger("0");

     String result = "";

     while (!base_ten.equals(BigInteger.valueOf(0))) {
        rem = base_ten.remainder(to_base);
        base_ten = base_ten.divide(to_base);
        result = result + alphabets.charAt(rem.intValue());
    }

    String reverse = new StringBuffer(result).reverse().toString();

    return reverse;
}

上記のコードは現在正常に動作します。以前は、次のことを行っていました。

while( base_ten != BigInteger.valueOf(0)) {

どうやらそれは BigIntegers で比較する方法ではなかったため、無限ループを引き起こしていました:)

4

0 に答える 0