一个很不错的题目,解决方法很精巧
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半数字,其中从最初的数字中可以任意排序。以两个0结尾的数字不允许的,列如:1260=21*60,2187=27*81, 请找出所有的四位的吸血鬼数字。
这个题目如果按照一般的思路,肯定是从 1000 开始到 9999 进行遍历,然后把两个乘数进行遍历,看是否符合条件,这种算法虽然能够做出题目,但是很复杂。
下面有大侠用java做了一个算法,俺认为很不错,值得学习。
考虑到 “对数字各包含乘积的一半数字,其中从最初的数字中可以任意排序” ,可以将 乘积考虑转化为字符串,两个乘数也转化为字符串,这样省去了很多的判断。
(此程序为转载)
public static void main(String[] arg){
String[] ar_str1,ar_str2;
int sum=0;
for(int i=10;i <100;i++){
for(int j=i+1;j <100;j++){
int i_val=i*j;
if(i_val <1000 || _val >9999)
continue; //积小于1000或大于9999排除,继续下一轮环
ar_str1=String.valueOf(i_val).split("");
//将整数转化为字符串
ar_str2=(String.valueOf(i)+String.valueOf(j)).split("");
//将 乘数相加转化为字符串
java.util.Arrays.sort(ar_str1);
java.util.Arrays.sort(ar_str2);
if(java.util.Arrays.equals(ar_str1, ar_str2)){
//排序后比较,为真则找到一组
sum++;
System.out.println("第"+sum+"组: "+i+"*"+j+"="+i_val);
}
}
}
System.out.println("共找到"+sum+"组吸血鬼数");
}