关于吸血鬼数字算法 整理

//普通算法 穷举所以可能 总的比较次数:3154
import java.util.Arrays;  
/** 
 *           吸血鬼数字 
 * 一个4位数字,可以拆分2个2位数数字的乘积
 * 比如 1395 =15 * 93 
 *  
 * @author Flyingtiger 
 */  

public class ObjectTestDemo02{
	public static void main(String args[]){
		int count1=0;//统计共有几个吸血鬼数字
		int count2=0;//统计比较计算次数
		//双重循环 穷举所有数字
		for(int i=10;i<=99;i++){
			for(int j=i+1;j<=99;j++){ //j=i+1 避免重复 相乘没有先后
				int sum=i*j;
				if(sum>1000&&sum%100!=0){ //不能以00结尾
					String sumStr[]=String.valueOf(sum).split("");//拆分成单个字符
					String ijString[]=String.valueOf((i+""+j)).split("");
					Arrays.sort(sumStr);
					Arrays.sort(ijString);// 按升序排序  以便比较
					count2++;
					if(Arrays.equals(sumStr, ijString)){//是否完全相同
						count1++;
						System.out.println("第"+count1+"组吸血鬼数字是:"+sum+"="+j+"*"+i);
					}
				}
			}
		}
		System.out.println("总的比较次数:"+count2);
	}
}
/*Output:(100% matches)
第1组吸血鬼数字是:1395=93*15
第2组吸血鬼数字是:1260=60*21
第3组吸血鬼数字是:1827=87*21
第4组吸血鬼数字是:2187=81*27
第5组吸血鬼数字是:1530=51*30
第6组吸血鬼数字是:1435=41*35
第7组吸血鬼数字是:6880=86*80
总的比较次数:3154

* */



//优化算法 穷举所以可能 总的比较次数:229
import java.util.Arrays;

/**
 * 吸血鬼数字 一个4位数字,可以拆分2个2位数数字的乘积 比如 1395 =15 * 93
 * 
 * @author Flyingtiger
 */

public class ObjectTestDemo01 {
	public static void main(String args[]) {
		int count1 = 0;// 统计共有几个吸血鬼数字
		int count2 = 0;// 统计比较计算次数
		int sum = 0;
		for (int i = 10; i <= 99; i++) {// 双重循环 穷举所有数字
			for (int j = i + 1; j <= 99; j++) { // j=i+1 避免重复 相乘没有先后
				sum = i * j;
				if (sum > 1000) {//循环条件限制 sum<10000 所以不用在判断
					if ((sum - i - j) % 9 != 0 || sum % 100 == 0) {
						continue;
					}
					String sumStr[] = String.valueOf(sum).split("");// 拆分成单个字符
					String ijString[] = String.valueOf((i + "" + j)).split("");
					Arrays.sort(sumStr);
					Arrays.sort(ijString);// 按升序排序 以便比较
					count2++;//比较次数++
					if (Arrays.equals(sumStr, ijString)) {// 是否完全相同
						count1++;
						System.out.println("第" + count1 + "组吸血鬼数字是:" + sum
								+ "=" + j + "*" + i);
					}
				}
			}
		}
		System.out.println("总的比较次数:" + count2);
	}
}
/*Output:(100% matches)
  第1组吸血鬼数字是:1395=93*15
第2组吸血鬼数字是:1260=60*21
第3组吸血鬼数字是:1827=87*21
第4组吸血鬼数字是:2187=81*27
第5组吸血鬼数字是:1530=51*30
第6组吸血鬼数字是:1435=41*35
第7组吸血鬼数字是:6880=86*80
总的比较次数:229

 * */

//通过函数调用 遍历1001到9999的所有数字  
/**
 * 吸血鬼数字 一个4位数字,可以拆分2个2位数数字的乘积 比如 1395 =15 * 93
 * 
 * @author Flyingtiger
 */

public class ObjectTestDemo03 {
	static int count = 0;

	public static void main(String args[]) {
		for (int i = 1001; i < 10000; i++) {
			if (result(cov(a(i), b(i)), cov(c(i), d(i)), i)) {
				// continue 目的去重 如6880=86*80 等abcd=ba*cd=ca*bd
				continue;
			}
			if (result(cov(a(i), b(i)), cov(d(i), c(i)), i)) {
				continue;
			}
			if (result(cov(a(i), c(i)), cov(b(i), d(i)), i)) {
				continue;
			}
			if (result(cov(a(i), c(i)), cov(d(i), b(i)), i)) {
				continue;
			}
			if (result(cov(a(i), d(i)), cov(c(i), b(i)), i)) {
				continue;
			}
			if (result(cov(a(i), d(i)), cov(b(i), c(i)), i)) {
				continue;
			}
			if (result(cov(b(i), a(i)), cov(c(i), d(i)), i)) {
				continue;
			}
			if (result(cov(b(i), a(i)), cov(d(i), c(i)), i)) {
				continue;
			}
			if (result(cov(c(i), a(i)), cov(b(i), d(i)), i)) {
				continue;
			}
			if (result(cov(c(i), a(i)), cov(d(i), b(i)), i)) {
				continue;
			}
			if (result(cov(d(i), a(i)), cov(c(i), b(i)), i)) {
				continue;
			}
			if (result(cov(d(i), a(i)), cov(b(i), c(i)), i)) {
				continue;
			}
		}
	}

	public static int a(int num) {// 求千位
		return num / 1000;
	}

	public static int b(int num) {// 求百位
		return num % 1000 / 100;
	}

	public static int c(int num) {// 求十位
		return num % 100 / 10;
	}

	public static int d(int num) {// 求个位
		return num % 10;
	}

	public static int cov(int i, int j) {
		return i * 10 + j;
	}

	public static boolean result(int i, int j, int sum) {
		boolean flag = false;
		if (sum == i * j && sum % 100 != 0) {
			count++;
			System.out.println("第" + count + "组是:" + sum + "=" + i + "*" + j);
			flag = true;
		}
		return flag;
	}
}
/*
 * Output:(100% matches) 
 * 第1组是:1260=21*60 
 * 第2组是:1395=15*93 
 * 第3组是:1435=41*35
 * 第4组是:1530=51*30 
 * 第5组是:1827=21*87 
 * 第6组是:2187=27*81 
 * 第7组是:6880=86*80
 */









                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值