Vampire数字,吸血鬼数字,有如下特征的称为吸血鬼数字
1、位数为偶数位
2、由两个数相乘得到的数,这两个数的位数一样。
3、该数字包含相乘的两个数字的所有位上的数字,可任意排序。
4、以00结尾的数字不是吸血鬼数字。
举例:1260=21*60,1827=21*87
实现思路:
在吸血鬼数字的因子(位数的一半)中遍历,每个数(因数1)都与它之后的所有数(因数2)相乘,然后将因数1和因数2的各个位上的数字放进一个数组中,再将因数1*因数2得到的数的各个位上的数字放至另一个数组中,然后将两个数组各自排序,再遍历比较,若两个数组中所有对应位置的数都相等,则因数1*因数2得到的数为吸血鬼数。
代码:
import java.util.Arrays;
import java.util.Scanner;
public class VampireNumber2 {
public static void main(String[] args) {
System.out.println("请输入范围数字的位数,(如1001~9999输入4):");
int n = new Scanner(System.in).nextInt();
int cnt = 0;
int number = 1;
int arrCnt1 = 0;
int arrCnt2 = 0;
int[] arr1 = new int[n];
int[] arr2 = new int[n];
int temp;
boolean flag = true;
for(int i = 0;i < n/2 -1;i++)
{
number *= 10;
}
int number1 = number*number*10; //吸血鬼数的最小值
System.out.println(number1+" "+number);
for(int i = number;i < number*10-1;i++) {
for(int j = i+1;j < number*10;j++) {
int bigNum = i*j;
if(bigNum%100 != 0 && bigNum >= number1) { //不以00结尾且大于10的n次方
arrCnt1 = 0;
arrCnt2 = 0;
temp = i;
while(temp != 0) {
arr1[arrCnt1++] = temp%10; //取每位数放至数组中
temp /= 10;
}
temp = j;
while(temp != 0) {
arr1[arrCnt1++] = temp%10; //取每位数放至数组中
temp /= 10;
}
temp = i*j;
while(temp != 0) {
arr2[arrCnt2++] = temp%10; //取每位数放至数组中
temp /= 10;
}
if(arrCnt1 == arrCnt2) { //长度相等才有相同的可能
Arrays.sort(arr1); //将数组排序便于比较
Arrays.sort(arr2);
flag = true;
for(int k = 0;k < n;k++) {
if(arr1[k] != arr2[k]) { //遍历每个数是否相等
flag = false; //有一个不相等即不可能相等
break;
}
}
if(flag) { //若为true,则都相等
System.out.println((i*j)+"="+i+"*"+j);
cnt++;
}
}
}
}
}
System.out.println("共"+cnt+"个");
}
}