package com.lesson8.test;
/*
* 【题目】吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字的位数是原数字的一半位数,
* 并且由组成原数字的各个位数组成,以两个0结尾的数字不是吸血鬼数字。
* 例如:1260 = 21 * 60 1827 = 21 * 87 2187= 27 * 81 ,
* 求所有四位吸血鬼数字
* */
/*
* 【解题思路】当前的解题思路很简单暴力,主要是利用枚举法,排序也是自定义的函数,并不复杂
* 1.利用枚举法:由于将所有四位数枚举一遍不能够得到由两个两位数相乘的四位数,因此需要枚举两位数,
* 得到可能为吸血鬼数字的四位数
* 即 x * y = z, x和 y是两位数,z是四位数
* 2.判断是否为吸血鬼数字:这对数字由组成原数字的各个位数组成,则只要所有位数相同就是吸血鬼数字
* 即 x * y = z,组成x和y的4个数和组成z的4个数相同
* 3.如何判断所有位数相同:将所有位数按序排列,最后得到两个内部有序的数字进行比较
* x * y = z,x和y的4个数排序后得到数字m,z内部位数排序后得到数字n,如果m == n,
* 表示x和y的4个数和z的4个数相同,否则表示存在不同的位数,则不是吸血鬼数
* */
//以1260 = 21 * 60 为例
//1260-----排序后为6210
//21 * 60------排序后为6210
public class Test {
/*
* 该方法用于枚举两位数,并判断是否为吸血鬼数字
* */
public void getNum(){
for(int x = 10; x <= 99; x++){
for(int y = x; y <= 99; y++){ //y=x避免重复
if(x * y < 1000 || x * y > 10000){
continue; //如果x*y不是四位数,则不符合条件,继续遍历
}
//判断是否为吸血鬼数字
if(sort(x*100+y) == sort(x*y)){
System.out.println(x + " * " + y + " = " + x*y);
}
}
}
}
/*
* 该方法用于对给定四位数进行内部排序(递减)
* @param num int
* return int 排序后得到的最大数
* */
public int sort(int num){
int n1 = num / 1000;
int n2 = num % 1000 / 100;
int n3 = num % 100 / 10;
int n4 = num % 10;
//一般三个以上数字的排序都可以转化成三个数字的排序,
//三个数字的排序则就是求最大、最小、中间值的固定套路
int max = getMax(n1, getMax(n2, getMax(n3, n4)));
int last3 = 0;//用来存储除最大数外其余三位数组成的最大数
if(n1 == max){
last3 = last3(n2, n3, n4);
}else if(n2 == max){
last3 = last3(n1, n3, n4);
}else if(n3 == max){
last3 = last3(n1, n2, n4);
}else{
last3 = last3(n1, n2, n3);
}
return (max * 1000 + last3);
}
/*
* 该方法用于获取最大值
* */
public int getMax(int x, int y){
return x>y?x:y;
}
/*
* 该方法用于获取最小值
* */
public int getMin(int x,int y){
return x>y?y:x;
}
/*
* 该方法用于得到除最大数外其余三位数组成的最大数
* */
public int last3(int x,int y,int z){
int max = getMax(x,getMax(y,z));
int min = getMin(x,getMin(y,z));
int mid = x + y + z - max - min;
return (max*100+mid*10+min);
}
public static void main(String args[]){
Test t = new Test();
t.getNum();
}
}