简体   繁体   中英

Why doesn't a program using BigInteger display anything?

My program displays Pascal's triangle. For enlarging the portion of the triangle that may be calculated and displayed, I've rewritten the code using BigInteger instead of primitive types.

Here's the code:

import java.math.BigInteger;

public class ptrig {
public static void main(String args[]) {
    BigInteger no = BigInteger.valueOf(5);

    // Creating the array
    String doubledim[][] = new String[no.intValue()][];
    BigInteger k;
    for (k = BigInteger.ZERO; k.compareTo(no) < 0; k.add(BigInteger.ONE)) {
        doubledim[k.intValue()] = new String[k.intValue() + BigInteger.ONE.intValue()];
    }

    // Assigning values
    BigInteger i, j, p, n;
    BigInteger l = BigInteger.ONE;
    for (i = BigInteger.ZERO; i.compareTo(no) < 0; i.add(BigInteger.ONE)) {
        for (j = BigInteger.ZERO; j.compareTo(i.add(BigInteger.ONE)) < 0; j.add(BigInteger.ONE)) {
            BigInteger m = i.subtract(j);
            if (j.compareTo(m) > 0) {
                for (p = BigInteger.ZERO; p.compareTo(m) < 0; p = p.add(BigInteger.ONE)) {
                    n = i.subtract(p);
                    l = l.multiply(n);
                }
                doubledim[i.intValue()][j.intValue()] = l.divide(factorial.factmet(m)).toString();
                l = BigInteger.ONE;
            }
            if (m.compareTo(j) > 0) {
                for (p = BigInteger.ZERO; p.compareTo(j) < 0; p = p.add(BigInteger.ONE)) {
                    n = i.add(p.add(BigInteger.ONE)).subtract(j);
                    l = l.multiply(n);
                }
                doubledim[i.intValue()][j.intValue()] = l.divide(factorial.factmet(j)).toString();
                l = BigInteger.ONE;
            }
            if (m.compareTo(j) == 0) {
                for (p = BigInteger.ZERO; p.compareTo(j) < 0; p = p.add(BigInteger.ONE)) {
                    n = i.subtract(p);
                    l = l.multiply(n);
                }
                doubledim[i.intValue()][j.intValue()] = l.divide(factorial.factmet(j)).toString();
                l = BigInteger.ONE;
            }
        }
    }

    // Printing
    for (i = BigInteger.ZERO; i.compareTo(no) < 0; i.add(BigInteger.ONE)) {
        for (j = BigInteger.ZERO; j.compareTo(i.add(BigInteger.ONE)) < 0; j.add(BigInteger.ONE)) {
            System.out.print(doubledim[i.intValue()][j.intValue()] + " ");
        }
        System.out.println();
    }
}
}

The problem is it displays nothing. I've read on Stack Overflow I need to convert the array values into strings for that they're displayed, so I did. I've also checked the System.out.println statements - they seem to be fine. The error persisted.

The algorithm itself worked fine on a previous version with primitive types.

What's the error here? I did my best to find an answer on the web, I couldn't. Thanks.

Your for-loops aren't incrementing their indices, and will therefor loop forever.

i.add(BigInteger.ONE) doesn't mutate i , it creates a new BigInteger and returns it . If you want to increment the value of i , you need to write i = i.add(BigInteger.ONE)


This means that when you try to initialize your array, you're entering an infinite loop, where you re-initialize doubledim[0] forever.

eg

for (k = BigInteger.ZERO; k.compareTo(no) < 0; k.add(BigInteger.ONE)) {
    doubledim[k.intValue()] = new String[k.intValue() + BigInteger.ONE.intValue()];
}

should be

for (k = BigInteger.ZERO; k.compareTo(no) < 0; k = k.add(BigInteger.ONE)) {
    doubledim[k.intValue()] = new String[k.intValue() + BigInteger.ONE.intValue()];
}

and you'll need to likewise fix the loops that control the population of data in your arrays, and printing of their data later in your program.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM