-1

I'm trying to create a boolean array for prime numbers. I'm supposed to end up with a result like:

Java PrimeArray 9

   1 2 3 4 5 6 7 8 9

1    T T T T T T T T

2 T    T F T F T F T

3 T T    T T F T T F

4 T F T    T F T F T

5 T T T T    T T T T

6 T F F F T    T F F

7 T T T T T T    T T

8 T F T F T F T    T

9 T T F T T F T T

I'm not getting the correct result. It isn't printing in rows and columns. I'm new to programming, but I tried playing around with different features of the array with no luck. Can someone please give me some tips on this?

public class PrimeArray {
    public static void main(String[] args) {

        int n = Integer.parseInt(args[0]);

        boolean[][] rpa = new boolean[n + 1][n + 1];

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++)

                if (i == j)
                    System.out.print(" ");
                else if ((i % j == 1))
                    System.out.print("T");
                else
                    System.out.print("F");

            System.out.print(i);
        }
    }
}

3 Answers3

0
Timur Efimov
  • 358
  • 2
  • 10
  • Look at this part of the question: " I realize I need to print rpa[i][j], but everytime I try to do that, it tells me it can't find the symbol for i or j". (but I could misunderstand) – Timur Efimov Sep 18 '21 at 22:33
0

Try this.

static int gcd(int a, int b) {
    while (b != 0) {
        int bb = b;
        b = a % b;
        a = bb;
    }
    return Math.abs(a);
}

public static void main(String[] args) {
    int n = 9;
    System.out.print(" ");
    for (int j = 1; j <= n; j++)
        System.out.print(" " + j);
    System.out.println();
    for (int i = 1; i <= n; i++) {
        System.out.print(i);
        for (int j = 1; j <= n; j++)
            if (i == j)
                System.out.print("  ");
            else if (gcd(i, j) == 1)
                System.out.print(" T");
            else
                System.out.print(" F");
        System.out.println();
    }
}

output:

  1 2 3 4 5 6 7 8 9
1   T T T T T T T T
2 T   T F T F T F T
3 T T   T T F T T F
4 T F T   T F T F T
5 T T T T   T T T T
6 T F F F T   T F F
7 T T T T T T   T T
8 T F T F T F T   T
9 T T F T T F T T  
  • Thanks! I put the second part of your solution into my boolean array and tweaked it a little bit. It works great! – gizmo.java Sep 21 '21 at 18:46
0

Here's a more elaborate version of the code. Thanks to saka1029 for the greatest common denominator code.

Here are the results of one of my test runs.

     1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  1     T  T  T  T  T  T  T  T  T  T  T  T  T  T
  2  T     T  F  T  F  T  F  T  F  T  F  T  F  T
  3  T  T     T  T  F  T  T  F  T  T  F  T  T  F
  4  T  F  T     T  F  T  F  T  F  T  F  T  F  T
  5  T  T  T  T     T  T  T  T  F  T  T  T  T  F
  6  T  F  F  F  T     T  F  F  F  T  F  T  F  F
  7  T  T  T  T  T  T     T  T  T  T  T  T  F  T
  8  T  F  T  F  T  F  T     T  F  T  F  T  F  T
  9  T  T  F  T  T  F  T  T     T  T  F  T  T  F
 10  T  F  T  F  F  F  T  F  T     T  F  T  F  F
 11  T  T  T  T  T  T  T  T  T  T     T  T  T  T
 12  T  F  F  F  T  F  T  F  F  F  T     T  F  F
 13  T  T  T  T  T  T  T  T  T  T  T  T     T  T
 14  T  F  T  F  T  F  F  F  T  F  T  F  T     T
 15  T  T  F  T  F  F  T  T  F  F  T  F  T  T   

I used String.format and StringBuilder to create the table. This code works with any positive maximum value, although large numbers will be difficult to display.

I broke my code into methods. Sure, this code could be written to be shorter, but the goal is for people reading the code to understand the code.

public class RelativePrimeNumbers {

    public static void main(String[] args) {
        try {
            int maximum = Integer.valueOf(args[0]);
            RelativePrimeNumbers rpn = new RelativePrimeNumbers();
            System.out.println(rpn.createRelativePrimeTable(maximum));
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }

    }
    
    public String createRelativePrimeTable(int maximum) {
        int length = Integer.toString(maximum).length() + 1;
        String numberFormatter = "%" + length + "d";
        String letterFormatter = "%" + length + "s"; 
        
        StringBuilder builder = new StringBuilder();
        builder.append(createHeaderLine(maximum, numberFormatter, letterFormatter));
        builder.append(System.lineSeparator());
        for (int index = 1; index <= maximum; index++) {
            builder.append(createDetailLine(index, maximum, 
                    numberFormatter, letterFormatter));
            builder.append(System.lineSeparator());
        }
        return builder.toString();
    }
    
    private StringBuilder createHeaderLine(int maximum, String numberFormatter, 
            String letterFormatter) {
        StringBuilder builder = new StringBuilder();
        builder.append(String.format(letterFormatter, " "));
        for (int index = 0; index < maximum; index++) {
            builder.append(String.format(numberFormatter, (index + 1)));
        }
        return builder;
    }
    
    private StringBuilder createDetailLine(int index, int maximum, 
            String numberFormatter, String letterFormatter) {
        StringBuilder builder = new StringBuilder();
        builder.append(String.format(numberFormatter, index));
        for (int jndex = 1; jndex <= maximum; jndex++) {
            if (index == jndex) {
                builder.append(String.format(letterFormatter, " "));
            } else if (calculateGCD(index, jndex) == 1) {
                builder.append(String.format(letterFormatter, "T"));
            } else {
                builder.append(String.format(letterFormatter, "F"));
            }
        }
        return builder;
    }
    
    private int calculateGCD(int a, int b) {
        while (b != 0) {
            int bb = b;
            b = a % b;
            a = bb;
        }
        return Math.abs(a);
    }

}
Gilbert Le Blanc
  • 50,182
  • 6
  • 67
  • 111