将1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1 : 2 : 3 的比例,试求出所有满足条件的 3个三位数
洛谷三连击---Java解法
题目:将1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1 : 2 : 3 的比例,试求出所有满足条件的 3个三位数。
这一题作为洛谷的经典例题,有着许多的解法。这里笔者将说出自己看到的或想到的一些想法。
解这道题的大致方法就是先创建三个数,让这三个数成比例,再分离,看9个数是否相同。这里的不同解法就出现在判断这9个数是否相等。
解法一:(个人觉得是一种比较普遍,也比较快的解法)
public class Main {public static void main(String[] args){int a, b, c,i,j=0; int[] s=new int[9]; for (a = 100; a < 333; a++) {b = 2 * a;c = 3 * a; //让三个数成比例 s[0] = a / 100; s[1] = a % 100 / 10; s[2] = a % 10; //分离每一位数,并用数组接受s[3] = b / 100; s[4] = b % 100 / 10; s[5] = b % 10;s[6] = c / 100; s[7] = c % 100 / 10; s[8] = c % 10;for (i = 0; i < 8; i++) {for (j = i + 1; j < 9; j++)if (s[i] == s[j]||s[i]==0||s[j]==0)break;//判断元素是否相等 if (j < 9) break;}if (i == 8 && j == 9) System. out. println(a+" " +b+ " "+c);}}
}
解法二:(认可度最高的解法)
public class Main {public static void main(String[] args) {int a, b, c;int[] s = new int[9];for (a = 100; a < 333; a++) {b = 2 * a;c = 3 * a;s[0] = a / 100;s[1] = a % 100 / 10;s[2] = a % 10;s[3] = b / 100;s[4] = b % 100 / 10;s[5] = b % 10;s[6] = c / 100;s[7] = c % 100 / 10;s[8] = c % 10;int n=1, q=0;for (int k = 0; k <s.length ; k++) {n=n*s[k];q=q+s[k];}if (n==1*2*3*4*5*6*7*8*9&&q==1+2+3+4+5+6+7+8+9)//这里通过两个条件限定这九个数System.out.println(a+" "+b+" "+c);}}
注意:这里是两个方程解九个未知数,答案肯定不唯一。但是这样写的原因就是数的范围被限定了。在该范围内只有一解,而这种方法只适合解这一道题,理论上是不严谨的。这种思想在日常的开发过程中用的很多,只专注与某个方法的实现,单单就一个问题而言。因为开发一个完整没有理论错误的程序是很难的。
解法三与解法四的差距不是特别大,并且由于HashSet的链表结构导致查询慢,所以三四方法的内存与时间会比一二方法多上一点。
解法三:利用HashSet集合不能存储相同的元素来判断数字是否相等(注意0这个元素),将满足!set.contains(0)&&set.size()==9的三组数输出即可。
import java.util.HashSet;public class Main {public static void main(String[] args){int a;HashSet<Integer> set=new HashSet<>();for (a = 123; a <=329 ; a++) {set.add(a/100);set.add(a%100/10);set.add(a%10);set.add(2*a/100);set.add(2*a%100/10);set.add(2*a%10);set.add(3*a/100);set.add(3*a%100/10);set.add(3*a%10);if (!set.contains(0)&&set.size()==9){System.out.println(a+" "+2*a+" "+3*a);set.clear();}set.clear();}}
}
解法四:(第四种方法把0的判断提到了之前)
import java.util.Set;public class Main {public static void main(String[] args) {int a;HashSe<Integer> set=new HashSet<>();for (a = 123; a <=329 ; a++) {if(a%100/10==0||a%10==0||2*a%100/10==0||2*a%10==0||3*a%100/10==0||3*a%10==0) continue;set.add(a/100);set.add(a%100/10);set.add(a%10);set.add(2*a/100);set.add(2*a%100/10);set.add(2*a%10);set.add(3*a/100);set.add(3*a%100/10);set.add(3*a%10);if (set.size()==9){System.out.println(a+" "+2*a+" "+3*a);set.clear();}set.clear();}}
}
运行结果: