这里是更详细的代码版本。感谢 saka1029 提供最大公分母代码。
这是我的一次测试运行的结果。
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
我使用String.format 和StringBuilder 创建表。此代码适用于任何正的最大值,但很难显示大数字。
我将代码分解为方法。当然,这段代码可以写得更短,但目标是让阅读代码的人理解代码。
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);
}
}