从集合{1-9}中选择9个数字,每3个数字形成一个三位数,每个数字只允许使用一次。最后的要求是三个三位数的比值为1:2:3。...

从集合{1-9}中选择9个数字,每3个数字形成一个三位数,每个数字只允许使用一次。最后的要求是三个三位数的比值为1:2:3。如何查找出这样的组合?

分析:
1. 首先,确定第一个数字的范围,最小是123,最大是987/3 = 329
2. 其次,确定怎么判断三个数字是符合条件的。这里比较巧妙的就是将数字的比较转换成字符串的比较。比如:
num1 = 192 , num2 = 384 , num3 = 576,
符合条件的几个数字组合成字符串, 然后排序。排序后的结果如果是“123456789”, 那就是我们想要的。

这样的组合一共有四组:
num1 = 192 , num2 = 384 , num3 = 576
num1 = 219 , num2 = 438 , num3 = 657
num1 = 273 , num2 = 546 , num3 = 819
num1 = 327 , num2 = 654 , num3 = 981

根据这样的思想,编写程序实现如下:
import java.util.Arrays;
/**
* 从集合{1-9}中选择9个数字,每3个数字形成一个三位数,每个数字只允许使用一次。
* 最后的要求是三个三位数的比值为1:2:3。如何查找出这样的组合?
*
* 分析:
1. 首先,确定第一个数字的范围,最小是123,最大是987/3 = 329
2. 其次,确定怎么判断三个数字是符合条件的。这里比较巧妙的就是将数字的比较转换成字符串的比较。比如:
num1 = 192 , num2 = 384 , num3 = 576,
符合条件的几个数字组合成字符串, 然后排序。排序后的结果如果是“123456789”, 那就是我们想要的。
* @author Eric
*
*/
public class FindNumbers {
/**
* 符合条件的字符数组。
*/
private static final char[] TARGET_CHARACTERS = convertToCharArray(123456789);

private StringBuilder sb = new StringBuilder();
public void execute() {
for (int num1 = 123; num1 <= 329; num1++) {
if (isCandidateNumber(num1)) {
print(num1);
}
}
}
/**
* 判断是否是符合条件的组合。
*/
private boolean isCandidateNumber(int num1) {
sb.setLength(0);
sb.append(num1).append(2 * num1).append(3 * num1);
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) {
System.out.print("num1 = " + num1);
System.out.print(" , ");
System.out.print("num2 = " + num1 * 2);
System.out.print(" , ");
System.out.print("num3 = " + num1 * 3);
System.out.println();
}
public static void main(String[] args) {
new FindNumbers().execute();
}
}

程序运行的结果:
num1 = 192 , num2 = 384 , num3 = 576
num1 = 219 , num2 = 438 , num3 = 657
num1 = 273 , num2 = 546 , num3 = 819
num1 = 327 , num2 = 654 , num3 = 981
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值