import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.Vector;
public class TestVampireNum {
static ArrayList list = null;
static int factor1 = 0;
static int factor2 = 0;
/**
* 遍历4位数,对每一个四位数进行判断是否为吸血鬼数字
*
*/
static void getFourPlaceVampireNum() {
for (int i = 1000; i < 10000; i++) {
list = new ArrayList();
if (i % 100 == 0)
continue;
if (isVampireNum(i)) {
System.out.println(factor1 + "*"+
factor2+"\t"+i + "是吸血鬼数字");
}
list = null;
}
}
/**
* 获得四位数的各个位数,并且进行全排列,
* 把全排列获得的组数存在list中,
* 并在对每种排列所产生的结果进行测试
* @param num
* @return
*/
static boolean isVampireNum(int num) {
String[] nums = new String[] { "" + num / 1000, "" + num / 100 % 10,
"" + num % 100 / 10, "" + num % 10 };
sort(Arrays.asList(nums), new ArrayList());
for (int i = 0; i < list.size(); i++) {
List ints = (List) list.get(i);
factor1 = Integer.parseInt(ints.get(0).toString()) * 10
+ Integer.parseInt(ints.get(1).toString());
factor2 = Integer.parseInt(ints.get(2).toString()) * 10
+ Integer.parseInt(ints.get(3).toString());
if (factor1 * factor2 == num)
return true;
}
return false;
}
/**
* 全排列方法,方法来自
* http://blog.csdn.net/sunyujia/archive/2009/04/26/4124011.aspx
* @param datas
* @param target
*/
private static void sort(List datas, List target) {
if (target.size() == 4) {
list.add(target);
return;
}
for (int i = 0; i < datas.size(); i++) {
List newData = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newData.get(i));
newData.remove(i);
sort(newData, newTarget);
}
}
/**
* 紫竹版算法
* 来自网络
*
*/
static void getFourPlaceVampireNum1()
{
String[] ar_str1, ar_str2;
int sum = 0;
int from;
int to;
int i_val;
int count = 0;
// 双重循环穷举
for (int i = 10; i < 100; i++) {
// j=i+1避免重复
from = Math.max(1000 / i, i + 1);
to = Math.min(10000 / i, 100);
for (int j = from; j < to; j++) {
i_val = i * j;
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}
count++;
ar_str1 = String.valueOf(i_val).split("");
ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");
Arrays.sort(ar_str1);
Arrays.sort(ar_str2);
if (Arrays.equals(ar_str1, ar_str2)) {// 排序后比较,为真则找到一组
sum++;
System.out.println("第" + sum + "组: " + i + "*" + j + "=" + i_val);
}
}
}
System.out.println("共找到" + sum + "组吸血鬼数");
System.out.println(count);
}
public static void main(String[] args0) {
long start = System.currentTimeMillis();
getFourPlaceVampireNum();
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
看了紫竹版的算法,才发现自己的能力。。。。
对于算法来说,效率才是最重要的。。