java全排列算法实现 --- 小例子实现

Question:猜算式

看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。

该算式中1至9的每个数字出现且只出现一次!

比如:

46 x 79 = 23 x 158

54 x 69 = 27 x 138

54 x 93 = 27 x 186

.....

请编程,输出所有可能的情况!

注意:

左边的两个乘数交换算同一方案,不要重复输出!

不同方案的输出顺序不重要

思路:

看到这道题的时候,立马想到的是 使用暴力破解方法 进行解决,即:写几层for循环进行操作,但是,太繁琐了,我就想,还有没有其他思路,联想到前段看过的全排列算法,然后,就使用这个思路进行编码了,源码如下:

/**

* @ 郝志超

*

*/

public class Question3 {

public static int total = 0; //记录符合条件的算式个数

//交换两个值

public static void swap(int[] intArrs, int i, int j) {

int temp;

temp = intArrs[i];

intArrs[i] = intArrs[j];

intArrs[j] = temp;

}

//全排列算法

public static void arrange(int[] intArrs, int st, int len) {

if (st == len - 1) {

if(intArrs[0] < intArrs[2]) {

if((intArrs[0] * 10 + intArrs[1]) * (intArrs[2] * 10 + intArrs[3]) == ((intArrs[4] * 10 + intArrs[5]) * (intArrs[6] * 100 + intArrs[7] * 10 + intArrs[8]))) {

System.out.println(intArrs[0] + "" + intArrs[1] + " * " + intArrs[2] + "" + intArrs[3] + " = " + intArrs[4] +""+ intArrs[5] + " * " + intArrs[6] + "" + intArrs[7] + "" + intArrs[8]);

total++;

}

}

// 打印所有全排列

/*for(int i = 0; i < len; i++) {

System.out.print(intArrs[i] + "  ");

}*/

} else {

for (int i = st; i < len; i++) {

swap(intArrs, st, i);

arrange(intArrs, st + 1, len);

swap(intArrs, st, i);

}

}

}

public static void main(String[] args) {

int intArrs[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

arrange(intArrs, 0, intArrs.length);

System.out.println(total);

}

}

打印结果:

46 * 79 = 23 * 158

54 * 69 = 27 * 138

54 * 93 = 27 * 186

58 * 67 = 29 * 134

58 * 69 = 23 * 174

58 * 73 = 29 * 146

58 * 96 = 32 * 174

63 * 74 = 18 * 259

64 * 79 = 32 * 158

73 * 96 = 12 * 584

76 * 98 = 14 * 532

11

时间: 2024-10-15 06:20:04

java全排列算法实现 --- 小例子实现的相关文章

Java网络连接测试小例子

花了两个小时时间去看书写例子,遇到不少蛋疼的问题,把例子贴出来,以免忘记 服务器端: import java.io.*; import java.net.*; public class mYServer { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; OutputStream os = null; InputStream is = null; //

JAVA 正则表达式截取字符串小例子

例如:从如下字符串 营业时间: 11:30-21:30 修改 分类标签: 无线上网(8) 可以刷卡(7) 朋友聚餐(5) 家庭聚会(5) 商务宴请(4) 情侣约会(4) 可自带酒水(2) 中获取: 11:30-21:30 两个数字:两数字-两个数字:两个数字 因此 正则表达式:\\d{2}:\\d{2}-\\d{2}:\\d{2} 具体代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; public clas

java数组使用的小例子

1 public class HelloWorld { 2 3 public static void main(String[] args) { 4 5 // 定义一个整型数组,并赋初值 6 int[] nums = new int[] { 61, 23, 4, 74, 13, 148, 20 }; 7 8 int max = nums[0]; // 假定最大值为数组中的第一个元素 9 int min = nums[0]; // 假定最小值为数组中的第一个元素 10 double sum = 0

Java正则表达式防注入小例子

1 /** 2 * 第一行匹配特殊字符: 3 * 第二行匹配开头和结尾都有空格的: 4 * 第三行匹配结尾有空格的 5 * */ 6 private Boolean DetermineChar(String reqData, String respData) { 7 String reg = "@@|==|--|!|\\!|" 8 + "\\s(union|and|or|where|exec|like|from|trancate|char|substr|ascii|count

java即时通信小例子

学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是在服务上开启一个线程循环等待客户端的连接,为每一个连接到服务器的Socket 创建一个实例存放在集合中,然后使用InputSteam读取从客户端发过来的数据然后转发给除自己之外的所有的客户端 然后是客户端,首先开启一个线程连接都服务器端,循环监听服务器发送回来的数据 这里要说一下为了明确是谁发出的消

java操作xml的一个小例子

最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要定义好bean的层次结构就可以了,第三方包会自动生成和解析xml. 但是今天发现,这个包有两个问题: 一个是比较复杂(我是菜鸟,求别喷,我真的觉得他挺复杂的..).比如说你要想处理既有属性又有值的xml就比较麻烦.(@XStreamConverter注解这种方法报这个错:com.thoughtwor

java连接mysql的一个小例子

想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一个小例子数据库如下如 代码 package query; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; impor

Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956