1到9九个数字,每3个数字形成一个三位数,且都是完全平方数,每个数字只允许使用一次。求解。
分析:
1. 确定范围。1-9九个数,取其中三个不同的数组成的三位数最大是987,最小是123。
因为123>121(=11*11),144=12*12,4出现两次不符合条件,169=13*13,符合条件。所以一个数的平方最小是169,那么这个数是13。同理,得出大概的最大数为32。经过三次循环,可以得到三个三位数的不同结果集合。
2. 判断三个三位数是否是符合条件的数字。在这里将数字的比较转换成字符串的比较。
比如:
num1 = 361 , num2 = 529 , num3 = 784,
符合条件的几个数字组合成字符串, 然后排序。排序后的结果如果是“123456789”, 那就是我们想要的。
最终只有一个唯一解:361, 529 , 784
具体的JAVA程序如下:
打印结果:
符合条件的三个数:361, 529 , 784
分析:
1. 确定范围。1-9九个数,取其中三个不同的数组成的三位数最大是987,最小是123。
因为123>121(=11*11),144=12*12,4出现两次不符合条件,169=13*13,符合条件。所以一个数的平方最小是169,那么这个数是13。同理,得出大概的最大数为32。经过三次循环,可以得到三个三位数的不同结果集合。
2. 判断三个三位数是否是符合条件的数字。在这里将数字的比较转换成字符串的比较。
比如:
num1 = 361 , num2 = 529 , num3 = 784,
符合条件的几个数字组合成字符串, 然后排序。排序后的结果如果是“123456789”, 那就是我们想要的。
最终只有一个唯一解:361, 529 , 784
具体的JAVA程序如下:
import java.text.MessageFormat;
import java.util.Arrays;
/**
* 题目:1-9,9个数组成三个三位数,且都是完全平方数(三个三位数 占据 9个数)
*
* 最终唯一解 361, 529 , 784
*
* @author Eric
*
*/
public class FindNumbers {
/**
* 定义一个输出三个数字的模板
*/
private static final String MESSAGE_FORMAT_PATTERN = "符合条件的三个数:"
+ "{0}, {1} , {2}";
/**
* 符合条件的字符数组。
*/
private static final char[] TARGET_CHARACTERS = convertToCharArray(123456789);
private StringBuilder sb = new StringBuilder();
public void execute() {
/**
* 标记是否找到需要的数字集合
*/
boolean found = false;
/**
* 1. 选择最小的值:123>121(=11*11),144=12*12,4出现两次不符合条件,169=13*13,所以最小只能是13
* 2. (1到9)中不同数字组合的三位数最大987, A*A<=987, 大概取值为33
* 三次循环比较数字是否是想要的。
*/
for (int num1 = 13; num1 < 33; num1++) {
for (int num2 = num1 + 1; num2 < 33; num2++) {
for (int num3 = num2 + 1; num3 < 33; num3++) {
/**
* 如果数字符合条件,将found标记为true,并且打印出结果。
*/
if (isCandidateNumbers(num1 * num1, num2 * num2, num3
* num3)) {
found = true;
print(num1 * num1, num2 * num2, num3 * num3);
}
}
}
}
/**
* 如果没有找到,则直接输出“没有找到副歌条件的数字”
*/
if (!found) {
System.out.println("没有找到符合条件的数字!");
}
}
/**
* 判断是否是符合条件的组合。
*/
private boolean isCandidateNumbers(int num1, int num2, int num3) {
sb.setLength(0);
sb.append(num1).append(num2).append(num3);
char[] array = sb.toString().toCharArray();
sortCharArray(array);
return Arrays.equals(array, TARGET_CHARACTERS);
}
/**
* 将数字转换成char数组的格式
*/
private static char[] convertToCharArray(int value) {
return String.valueOf(value).toCharArray();
}
/**
* 对char数组进行排序
*/
private void sortCharArray(char[] array) {
Arrays.sort(array);
}
/**
* 打印出符合条件的数字组合
*/
private void print(int num1, int num2, int num3) {
System.out.println(MessageFormat.format(MESSAGE_FORMAT_PATTERN, num1,
num2, num3));
}
public static void main(String[] args) {
FindNumbers fn = new FindNumbers();
fn.execute();
}
}
打印结果:
符合条件的三个数:361, 529 , 784