博主是先学的c然后再学的java,所以当我遇到这个题目的时候,我首先想到的是能不能先用c来写,思前想后,终于还是写出来了,以下是c的源代码:
#include<stdio.h>
int ResultArray[100];
int r = 0;
bool findInResultArray(int x){
for(int i = 0 ; i < 100 ; i ++){
if(x == ResultArray[i])
return true;
}
return false;
}
void judgeVampire(int a[] , int x){
int flage[4];
for(int i = 0 ; i < 4 ; i ++){
flage[i] = 0;
}
for(int i = 0 ; i < 4 ; i ++){
if(flage[i] == 1) continue;
flage[i] = 1;
for(int j = 0 ; j < 4 ; j ++){
if(flage[j] == 1) continue;
flage[j] = 1;
int R1 = a[i] * 10 + a[j];
for(int k = 0 ; k < 4 ; k ++){
if(flage[k] == 1) continue;
flage[k] = 1;
for(int m = 0 ; m < 4 ; m ++){
if(flage[m] == 1) continue;
flage[m] = 1;
int R2 = a[k] * 10 + a[m];
int R = R1 * R2;
if(R == x){
if(!findInResultArray(R)){
ResultArray[r++] = R;
printf("%d = %d * %d \n",x,R1,R2);
}
}
flage[m] = 0;
}
flage[k] = 0;
}
flage[j] = 0;
}
flage[i] = 0;
}
}
void getEveryNumber(int a[] , int x){
int i = 3;
while(x > 0){
a[i--] = x % 10;
x /= 10;
}
}
int main(){
int a[4];
for(int i = 1000 ; i < 10000 ; i ++){
getEveryNumber(a,i);
judgeVampire(a,i);
}
return 0;
}
然后我在根据这个思想,再写成java的代码,基本上没什么大的变化,有一个小小的细节,后面和大家分享,以下是java源代码:
public class Vampire {
public static int[] ResultArray = new int[100];
public static int r = 0;
public static void main(String[] args){
int[] array = new int[4];
for(int i = 1000 ; i < 10000 ; i ++){
getEveryNumber(array,i);
judgeVampire(array,i);
}
}
public static boolean findInResultArray(int x){
for(int i = 0 ; i < ResultArray.length; i ++ ){
if(x == ResultArray[i]){
return true;
}
}
return false;
}
public static void getEveryNumber(int[] a,int x){
int i = 3;
while(x>0){
a[i--] = x % 10;
x /= 10;
}
}
public static void judgeVampire(int[] a,int x){
boolean[] flage = new boolean[4];
for(int i = 0 ; i < 4 ; i ++){
flage[i] = false;
}
for(int i = 0 ; i < 4 ; i ++){
if(flage[i]) continue ;
flage[i] = true;
for(int j = 0 ; j < 4; j ++){
if(flage[j]) continue ;
flage[j] = true;
int R1 = a[i] * 10 + a[j];
for(int k = 0 ; k < 4; k ++){
if(flage[k]) continue ;
flage[k] = true;
for(int m = 0 ; m < 4; m ++){
if(flage[m]) continue ;
flage[m] = true;
int R2 = a[k] * 10 + a[m];
int R = R1 * R2;
if(R == x){
if(!findInResultArray(R)){
ResultArray[r++] = R;
System.out.println(x + "=" + R1 + "*" + R2);
}
}
flage[m] = false;
}
flage[k] = false;
}
flage[j] = false;
}
flage[i] = false;
}
}
}
在写java的时候,博主一不小心把最里层的判断条件写成了:
if(flage[m] = true) continue;
结果导致没有输出结果,在这里卡死了很久,后来博主咨询了其他大牛,终于找到了这个错误。
同时呢,这位大牛也为我普及了一下知识,就是:
布尔变量的值本身就足以用来控制if语句,因此不大可不必写成:
if(flage[m] == true)
的形式,直接写成:
if(flage[m])
就好了。
另外附上一张在MyEclipse下的运行结果