马虎的算式
来源:互联网 发布:php gb2312转utf8 编辑:程序博客网 时间:2024/06/08 06:24
/*小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36 x 495 = ?他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!! 因为 36 * 495 = 396 * 45 = 17820 类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54 假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0) 能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢? 请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。 满足乘法交换律的算式计为不同的种类, 所以答案肯定是个偶数。*///解法一:/*import java.util.ArrayList;import java.util.List;public class 马虎的算法 {static int count = 0;public static void check(List<Integer> lis) {int a = lis.get(0);int b = lis.get(1);int c = lis.get(2);int d = lis.get(3);int e = lis.get(4);int l = (a * 10 + b) * (c * 100 + d * 10 + e);int r = (a * 100 + d * 10 + b) * (c * 10 + e);if (l == r) {count++;}}// 在1~9里 的5个数全排列public static void f(List<Integer> lis, int start, int end) {if (start == end) {check(lis);return;}for (int i = 1; i <= 9; i++) {if (!lis.contains(i)) {lis.set(start, i);} else {continue;}f(lis, start + 1, end);lis.set(start, 0);}}public static void main(String[] args) {List<Integer> lis = new ArrayList<Integer>();for (int i = 0; i < 5; i++) {lis.add(0); // 初始化为全0}f(lis, 0, 5); // 在1~9里 的5个数全排列System.out.println(count);}}*/// 解法二/*public class 马虎的算法 {static int kinds = 0;static int a[] = new int[6];static boolean vis[] = new boolean[10];static void check(int a[]) {int b = a[1] * 10 + a[2];int c = a[3] * 100 + a[4] * 10 + a[5];int d = a[1] * 100 + a[4] * 10 + a[2];int e = a[3] * 10 + a[5];if (b * c == d * e)kinds++;}static void dfs(int start, int end) {if (start == end) {check(a);} else {for (int i = 1; i < 10; i++) {if (vis[i])continue;a[start] = i;vis[i] = true;dfs(start + 1, end);vis[i] = false;}}}public static void main(String[] args) {dfs(1, 6);System.out.println(kinds);}}*///解法3/*import java.util.ArrayList; import java.util.List; public class 马虎的算法{ static int kinds= 0; // 记录个数 public static void check(List<Character> lis) {int a = lis.get(0)-'0';int b = lis.get(1)-'0';int c = lis.get(2)-'0';int d = lis.get(3)-'0';int e = lis.get(4)-'0';int l = (a * 10 + b) * (c * 100 + d * 10 + e);int r = (a * 100 + d * 10 + b) * (c * 10 + e);if (l == r) {kinds++;}} // m排n全排列 public static void f(List<Character> lis,char[] c,int start,int end){ if(start==end){ check(lis); return ; } for(int i=0;i<c.length;i++){ if(!lis.contains(c[i])){ lis.set(start, c[i]); }else{ continue; } f(lis,c,start+1,end); lis.set(start, '0'); } } public static void main(String[] args) { int n = 5; char[] c = "123456789".toCharArray(); List<Character> lis = new ArrayList<Character>(); for(int i=0;i<n;i++){ lis.add('0'); } f(lis,c,0,5); System.out.println("排列个数:"+kinds); } } *///解法四import java.util.ArrayList; import java.util.List; public class 马虎的算法 { static int kinds= 0; // 记录个数 public static void check(List<Character> lis) {int a = lis.get(0)-'0';int b = lis.get(1)-'0';int c = lis.get(2)-'0';int d = lis.get(3)-'0';int e = lis.get(4)-'0';int l = (a * 10 + b) * (c * 100 + d * 10 + e);int r = (a * 100 + d * 10 + b) * (c * 10 + e);if (l == r) {//System.out.println(lis);kinds++;}} public static char[] is = new char[] { '1', '2', '3', '4', '5', '6', '7', '8', '9'}; public static void f(List<Character> lis, int start,int end) { if(start == end) { check(lis); return ; } List<Character> lis1; for(int i = 0; i < is.length; i++) { lis1 = new ArrayList<Character>(); lis1.addAll(lis); if(!lis.contains(is[i])) { lis1.add(is[i]); f(lis1,start+1,end ); } } } public static void main(String[] args) { List<Character> lis = new ArrayList<Character>(); f(lis,0,5); System.out.println(kinds); } }