//普通算法 穷举所以可能 总的比较次数: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
*/