吸血鬼算法

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);

	}
}

 看了紫竹版的算法,才发现自己的能力。。。。

对于算法来说,效率才是最重要的。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值