最近在看《Thinking in Java》的时候,碰到了一体关于吸血鬼数字的问题,就上机做了一下,下面是代码和结果(因为我刚接触编程4个多月,是个大一的学生,所以代码的风格不是太好,望海涵)!我的大概思路是对每一个四位数进行测试,将它拆分开来,然后进行检验是否可以表示成他自己的数字的乘积。很简单的想法。。。,麻烦高手耐心看一下,并且给我一些建议,感激不尽啊!
public class Vampire{
public static void main(String[] args) {
long t1=System.currentTimeMillis();
Vampire v=new Vampire();
v.getNumber();
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
//输出运行时间
}
public void getNumber()
{
int num=1001;
while(true)
{ int i=num;
if(num==99*99+1){//需要测试的最大数字
break;
}
if(i==2000||i==3000||i==4000||i==5000||i==6000||i==7000||i==8000||i==9000)
{ num++;
continue;
}//有三个零的数肯定是不可以的
else {
int []digits=new int [4];
for(int n=0;n<4;n++)
{
digits[n]=i%10;
i=i/10;
}//把这个四位数拆分开来,取出他的各位数字
//下面分为三种情况进行检测,是否符合要求,如果符合就输出该数并且将该数递增后回到循环体开始部分
int a1=digits[0];
int b1=digits [1];
int c1=digits[2];
int d1=digits[3];
if(num==(a1*10+b1)*(c1*10+d1)||num==(a1*10+b1)*(d1*10+c1) ||num== (b1*10+a1)*(c1*10+d1)||num==(b1*10+a1)*(d1*10+c1)){
System.out.println(num);
num++;
continue;
}
a1=digits[0];
b1=digits[2];
c1=digits[1];
d1=digits[3];
if(num==(a1*10+b1)*(c1*10+d1)||num==(a1*10+b1)*(d1*10+c1)||num==(b1*10+a1)*(c1*10+d1)||num==(b1*10+a1)*(d1*10+c1)){
System.out.println(num);
num++;
continue;
}
a1=digits[0];
b1=digits[3];
c1=digits[1];
d1=digits[2];
if(num==(a1*10+b1)*(c1*10+d1)||num==(a1*10+b1)*(d1*10+c1)||num==(b1*10+a1)*(c1*10+d1)||num==(b1*10+a1)*(d1*10+c1)){
System.out.println(num);
num++;
continue;
}
num++;//如果该数不是吸血鬼数字那么还是要递增后回到循环体开头的
}
}
}
}
输出来的结果是:
1260
1395
1435
1530
1827
2187
6880
15
用了15毫秒,总觉得还有可以优化的地方,希望那位高手给我指点一下啊!