问题描述:吸血鬼数字是指个数为偶数位的数字,它可以拆分成两个数字的乘积,这两个数字各包含乘积的一半位的数字,数字的顺序任意.(以两个00结尾的数字不是吸血鬼数字)
如
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81
都是吸血鬼数字, 写出一个程序,找出4位数的所有吸血鬼数字
一般解法:
public class mgs
{
int num=0;
void mg(int i)
{
int ii[]=new int[4];
int mgsz=0;
int a1=0,a2=0,a3=0,a4=0;
int a,b,c,d;
ii[0]=(int)i/1000;
ii[1]=(int)((i-ii[0]*1000)/100);
ii[2]=(int)(i-ii[0]*1000-ii[1]*100)/10;
ii[3]=(int)(i-ii[0]*1000-ii[1]*100-ii[2]*10);
if((ii[2]!=0) || (ii[3]!=0))
for(a=0;a<4;a++)
{
a1=ii[a];
for(b=0;b<4;b++)
{
if(a!=b)
a2=ii[b];
for(c=0;c<4;c++)
{
if((a!=b) &&(a!=c)&&(b!=c))
a3=ii[c];
for(d=0;d<4;d++)
{
if((a!=b) &&(a!=c) && (a!=d)&&(b!=c)&&(b!=d)&&(c!=d))
{
a4=ii[d];
mgsz=(a1*10+a2)*(a3*10+a4);
if(mgsz==i)
{
num++;
System.out.println("第"+num+"组:"+
(a1*10+a2)+"*"+(a3*10+a4)+"="+mgsz);
return;
}
}
}
}
}
}
}
public static void main(String[] args)
{
mgs mg=new mgs();
for(int x=1000;x<=9999;x++)
mg.mg(x);
System.out.println("共有"+mg.num+"个");
}
}
从网上又看到一个,不过没看懂其算法,他对性能的提高在10倍哦
import java.util.Arrays;
/**
* 吸血鬼数字,高效率版本.<br>
* 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。<br>
* 比如 1395 =15 * 93
*
* @author 老紫竹(laozizhu.com)
*/
public class Vampire {
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++) {
// j=i+1避免重复
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);
}
}
运行结果
第1组: 15*93=1395
第2组: 21*60=1260
第3组: 21*87=1827
第4组: 27*81=2187
第5组: 30*51=1530
第6组: 35*41=1435
第7组: 80*86=6880
共找到7组吸血鬼数
232
可以看到,只比较了232次,如果普通的大致有4000次