问题描述:将1,2,3,4,5,6,7,8,9共9个数分成三组,组成3个三位数,且使这3个三位数构成1:2:3的比例,例如:3个三位数192,384,576满足以上条件.192:384:576=1:2:3。试求出所有满足条件的3个三位数。
解题思路:最小三位数为123,最大三位数为987,则987/3=329,所以枚举范围123~329。网上有网友提出新思路,本人觉得非常好。其思路为其实要判断这三个数是否由1~9组成且各个数组不相同,即这三个数的各位数是否覆盖了1~9,只要判断各位数字的积是否等于9!且各位数字的和是否等于45。较以往的方法有很大的进步性,本人采用java讲该位网友的新方法写了一遍,欢迎建议和意见。具体代码如下。
/**
*
* 作者:RobotHaptic
* 日期:2015.08.14
* 功能:将1,2,3,4,5,6,7,8,9共9个数分成三组,
* 组成3个三位数,且使这3个三位数构成1:2:3的比例,
* 例如:3个三位数192,384,576满足以上条件.
* 192:384:576=1:2:3。试求出所有满足条件的3个三位数
*
*/
public class OneTwoThree {
//构造函数
public OneTwoThree(){
}
//求num上每位上数的和
public int getSum(int num){
int singleDigit = num % 10;
int tensDigit = num / 10 % 10;
int hundredDigit = num /100;
int sum = singleDigit + tensDigit + hundredDigit;
return sum;
}
//求num每位上的数的积
public int getMul(int num){
int singleDigit = num % 10;
int tensDigit = num / 10 % 10;
int hundredDigit = num /100;
int sum = singleDigit * tensDigit * hundredDigit;
return sum;
}
//是否满足要求
//网上有网友提出方法,只要判断各位数字的积是否等于9!且各位数字的和是否等于45。
public boolean isRight(int num1){
if ((getSum(num1) + getSum(num1 * 2) + getSum(num1 * 3) == 45) &&
getMul(num1)*getMul(num1 * 2)*getMul(num1 * 3) == 9*8*7*6*5*4*3*2) {
return true;
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
OneTwoThree ott = new OneTwoThree();
/*
* 1~9组成的最小三位数是123,最大的是987,由于要满足1:2:3的关系,
最小的那个数应该不到于987/3=329。这样的话第一个数的变化范围是123~329
*/
for (int i = 123; i < 329; i++) {
if(ott.isRight(i)){
//把每个满足要求的数打印出来
System.out.println(i + " " + (2*i) + " " + (3*i));
}
}
}
}
控制台输出如下:
192 384 576
219 438 657
273 546 819
327 654 981