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