0

I have written the following code:

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;
        }

Using the above code, it is possible to convert strings like say "suchin" (Base 31) to other bases. But whenever I use something larger, like say "suchind", I get an exception at the following line in above code:

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

saying that the index is -1. When I dug a little deeper, I felt that rem.intValue() is somehow going negative (-1) for some large values. Not sure how to get this solved. Is there a way of converting between bases for large numbers in java?

BigInteger version of code is below:

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;
}

The above code works fine now. Earlier I had done the following:

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

Which was causing infinite loop, as apparently that was not the way to compare in BigIntegers :)

0 Answers0