题目:
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不被允许的,例如,下列数字都是“吸血鬼”数字:
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81
写一个程序,找出4位数的所有吸血鬼数字。
我的解题思路:
把四位数的每一位拆分出来,然后两两组合,放在一个数字中,用这个四位数循环去除,如果四位数能被整除,则再判断整除后得到的结果等不等于不做除数的另外两个数字的某一个组合,如果等于,这个数字就是“吸血鬼”数字。具体的代码如下:
package src;
public class BloodSuckerNumber {
static void bloodSuckerNumber(int num){
//定义变量a,b,c,d分别表示四位数中个,十,百,千为上的数
int a = 0;
int b = 0;
int c = 0;
int d = 0;
//根据题意,把a,b,c,d两两不重复组合,共有12种组合方式
//每个组合的值都放在数组中
int arr[] = new int[12];
//定义两个中间用的变量
int res = 0;
int middle = 0;
//分别取得个十百千为上的数
a = num % 10;
b = (num/10) % 10;
c = (num / 100) % 10;
d = num /1000;
//得出取得个十百千位上的12种组合的值,放在定义好的数组中
arr[0] = a * 10 + b;
arr[1] = a * 10 + c;
arr[2] = a * 10 + d;
arr[3] = b * 10 + a;
arr[4] = b * 10 + c;
arr[5] = b * 10 + d;
arr[6] = c * 10 + a;
arr[7] = c * 10 + b;
arr[8] = c * 10 + d;
arr[9] = d * 10 + a;
arr[10] = d * 10 + b;
arr[11] = d * 10 + c;
//循环判断开始
for(int i = 0; i<arr.length; i++){
//这儿进行这个判断一是为了防止除数为0产生程序异常,
//二来也可以排除一些数据,因为没有一个四位数是由零乘以某个数得到的
if(arr[i] == 0){
break;
}
//判断传入的四位数可不可以被自身拆成的某个两位数整除
res = num % arr[i];
//如果能被整除,则判断整除后得到的结果是不是等于剩余的两个数的组合
if( res == 0){
//取得整除后的结果
middle = num/arr[i];
//如果i=0 或者3的时候,则说明除数是有a(个位),b(十位)组成的
//则下面判断整数后的结果等不等于c(百位)和d(千位)的某个组合
//如果等于则说明这个四位数是吸血鬼数字,打印其结果
//其余的几种情况类似
if(i == 0 || i == 3){
if(middle == arr[8] || middle == arr[11]){
//控制数字的输入顺序,把小的数字输出在等号前面,大的数字输出在等号后面
if(arr[i] < middle){
System.out.println(num + " = " + arr[i] + " * " + middle);
}else{
System.out.println(num + " = " + middle + " * " + arr[i]);
}
break;
}
}
//i=1或者6的时候
else if(i == 1 || i == 6){
if(middle == arr[5] || middle == arr[10]){
//控制数字的输入顺序,把小的数字输出在等号前面,大的数字输出在等号后面
if(arr[i] < middle){
System.out.println(num + " = " + arr[i] + " * " + middle);
}else{
System.out.println(num + " = " + middle + " * " + arr[i]);
}
break;
}
}
//i=2或者9的时候
else if(i == 2 || i == 9){
if(middle == arr[4] || middle == arr[7]){
//控制数字的输入顺序,把小的数字输出在等号前面,大的数字输出在等号后面
if(arr[i] < middle){
System.out.println(num + " = " + arr[i] + " * " + middle);
}else{
System.out.println(num + " = " + middle + " * " + arr[i]);
}
break;
}
}
//i=4或者7的时候
else if(i == 4 || i == 7){
if(middle == arr[2] || middle == arr[9]){
//控制数字的输入顺序,把小的数字输出在等号前面,大的数字输出在等号后面
if(arr[i] < middle){
System.out.println(num + " = " + arr[i] + " * " + middle);
}else{
System.out.println(num + " = " + middle + " * " + arr[i]);
}
break;
}
}
//i=5或者10的时候
else if(i == 5 || i == 10){
if(middle == arr[1] || middle == arr[6]){
//控制数字的输入顺序,把小的数字输出在等号前面,大的数字输出在等号后面
if(arr[i] < middle){
System.out.println(num + " = " + arr[i] + " * " + middle);
}else{
System.out.println(num + " = " + middle + " * " + arr[i]);
}
break;
}
}
//i=8或者11的时候
else if(i == 8 || i == 11){
if(middle == arr[0] || middle == arr[3]){
//控制数字的输入顺序,把小的数字输出在等号前面,大的数字输出在等号后面
if(arr[i] < middle){
System.out.println(num + " = " + arr[i] + " * " + middle);
}else{
System.out.println(num + " = " + middle + " * " + arr[i]);
}
break;
}
}
}
}
}
public static void main(String[] args){
//打印四位数中的吸血鬼数字
for(int i = 1001; i<9999; i++){
//根据题意最后两个数是都是0的不允许,则把其去掉
if(i%100 == 0){
continue;
}else{
//调用吸血鬼数字的判断方法
bloodSuckerNumber(i);
}
}
}
}
程序得到的结果是:
1260 = 21 * 60
1395 = 15 * 93
1435 = 35 * 41
1530 = 30 * 51
1827 = 21 * 87
2187 = 27 * 81
6880 = 80 * 86
自我评价:程序写的不好,至少不应该在方法中直接输出结果,还有待进一步的改进。