一、描述
将1,2,...,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例。例如:三个三位数192,384,576满足以上条件。
试求出所有满足条件的三个三位数。
二、格式
- 输入格式:无输入
- 输出格式:需要输出全部结果。每行输出3个数 用空格隔开。按照字典序的顺序输出。
三、思路
- 基本思路是 遍历 100--999之间的数,并判断是否符合上述条件,若满足则输出。
- 设满足条件的三个数分别是a,b,c,考虑到三位数最大是999,所以 a的取值范围应该是:100<a<333,又三位数的三个数字是不能重复的,所以a的最小值应该是123,最大值应该是 329,所以 最终a的范围是 123<=a<=329。
- 关于三个数是否满足上述条件的判断:
分别取三个数的百位、十位、个位上的数字,并存入一个数组int[] a中,
然后创建一个计数器,接着进行一个两层循环的嵌套,外层循环范围 1<i<10,内层循环范围 0<j<9,内层循环中进行判断:如果 i==a[j], 计数器+1,并中止内层循环。
等整个两层循环执行完后,对计数器进行判断,如果 计数器 = 9,则是满足条件的三个三位数;如果 计数器<9,则三个三位数不满足条件(组成三个三位数的 9 个数字中有重复的)。 - 至于与计数器进行判断的 9 是怎么得来的呢?
循环遍历数组a,并用数字1 与a[i]比较,如果相等,计数器+1,并中止内层循环。
在满足条件的情况下,因为数组a中的数是不重复的,所以只有一个1,计数器只能执行一次+1操作。同理用 2 去比较,计数器也只能执行一次 +1。 故分别用1-9去与a[i]比较,计数器会累计进行9次+1操作,则计数器等于9.
不满足条件时,即数组中有重复的数字,则从1到9中肯定至少缺少一个数字,进行上述操作时因为至少有一次是匹配不到的,所以计数器小于9。如 a={1,2,3,4,4,6,7,8,9} ,缺少了5,当用5去匹配数组a[i]时,则匹配不到,故计数器会少进行一次 +1 操作,计数器的值等于8,小于9。
理论上,计数器大于9的情况是不可能出现的。
四、代码
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int b = 1;b<4;b++){ //百位上的数字
for(int s = 1;s<10;s++){ //十位上的数字
if(s!=b){
for(int g = 1;g<10;g++){ //个位上的数字
if(g!=b&&g!=s){
int num1 = b*100+s*10+g;
if(num1<333){
int num2 = num1*2;
int num3 = num1*3;
if(geshi(num1,num2,num3)){
System.out.println(num1+" "+num2+" "+num3);
}
}
}
}
}
}
}
}
//对三个三位数是否满足条件进行判断
public static boolean geshi(int num1,int num2,int num3){
//分别取三个数的 百位、十位、个位上的数字,并存到数组中
int b1 = num1/100;
int s1 = num1/10%10;
int g1 = num1%10;
int b2 = num2/100;
int s2 = num2/10%10;
int g2 = num2%10;
int b3 = num3/100;
int s3 = num3/10%10;
int g3 = num3%10;
int[] a = {b1,s1,g1,b2,s2,g2,b3,s3,g3};
// 定义计数器
int flag =0;
//对数组a中是否有重复数字进行判断
for(int i = 1;i<10;i++){
for(int j = 0;j<a.length;j++){
if(i==a[j]){
flag++;
break;
}
}
}
if(flag==9){ //满足条件的三个数,返回true
return true;
}else{ //不满足条件的三个数,返回false
return false;
}
}
}