题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,这对数字各包含乘积的一半位数的数字,数字选取后可任意排序。写出一个程序,找出4位数的所有吸血鬼数字。
两个比较优化的解题方法:其中关于可能吸血鬼数字的筛选条件和将数字单个位放到数组中的方法有所区别。
NO.1
import java.util.Arrays;
class Vampire
{
public static void main(String[] args)
{
int[] startDigit=new int[4];
int[] productDigit=new int[4];
int count=0;
int sum=0;
for(int num1=10;num1<=99;num1++)
for(int num2=num1;num2<=99;num2++)
{
if((num1*num2)%9!=(num1+num2)%9||(num1*num2)%100==0)
continue;
count++;
int product=num1*num2;
startDigit[0]=num1/10;
startDigit[1]=num1%10;
startDigit[2]=num2/10;
startDigit[3]=num2%10;
productDigit[0]=product/1000;
productDigit[1]=(product%1000)/100;
productDigit[2]=product%1000%100/10;
productDigit[3]=product%1000%100%10;
Arrays.sort(startDigit);
Arrays.sort(productDigit);
if(Arrays.equals(startDigit,productDigit))
{
sum++;
System.out.println(num1+"*"+num2+"="+product);
}
}
System.out.println("4位数中吸血鬼数总共有:"+sum+"个");
System.out.println(count);
}
}
运行结果:
NO.2
import java.util.Arrays;
public class Vampire2 {
public static void main(String[] arg) {
String[] ar_str1, ar_str2;
int sum = 0;
int from;
int to;
int i_val;
int count = 0;
for (int i = 10; i < 100; i++) {
from = Math.max(1000 / i, i + 1);
to = Math.min(10000 / i, 100);
for (int j = from; j < to; j++) {
i_val = i * j;
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0)
continue;
count++;
ar_str1 = String.valueOf(i_val).split("");
ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");
Arrays.sort(ar_str1);
Arrays.sort(ar_str2);
if (Arrays.equals(ar_str1, ar_str2)) {
sum++;
System.out.println("第" + sum + "组: " + i + "*" + j + "=" + i_val);
}
}
}
System.out.println("共找到" + sum + "组吸血鬼数");
System.out.println(count);
}
}
运行结果:
结论:通过发现吸血鬼数字的一些特征,可以减少循环内部执行的次数。