古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA

/*
 * 古堡算式
    福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
    ABCDE * ? = EDCBA
    他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
    华生:“我猜也是!”
    于是,两人沉默了好久,还是没有算出合适的结果来。
    请你利用计算机的优势,找到破解的答案。
    把 ABCDE 所代表的数字写出来。
    答案写在“解答.txt”中,不要写在这里!
 */
public class TDemo02_two {
	public static void main(String[] args){
		for(int i=10000;i<100000;i++){
			int a = i/10000;
			int b = i%10000/1000;
			int c = i%10000%1000/100;
			int d = i%10000%1000%100/10;
			int e = i%10;
			if(a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e){
				continue;
			}
			int y = e*10000+d*1000+c*100+b*10+a;
			if(y%i==0){
				System.out.println(i+"*"+y/i+"="+y);
			}
		}
	}
}

运行结果:

21978*4=87912

方法二:

/*
 * 古堡算式
    福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
    ABCDE * ? = EDCBA
    他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
    华生:“我猜也是!”
    于是,两人沉默了好久,还是没有算出合适的结果来。
    请你利用计算机的优势,找到破解的答案。
    把 ABCDE 所代表的数字写出来。
    答案写在“解答.txt”中,不要写在这里!
 */
public class Demo02 {
	// 检查是否是全111111...
	public static boolean check(int[] b){
		boolean flag = true;
		for(int i=0;i<b.length;i++){
			if(b[i]==0){
				flag = false;
				break;
			}
		}
		return flag;
	}
	// 检查是否是一个五位数
	public static boolean checkFive(int[] b){
		boolean flag = false;
		int count = 0;
		for(int i=0;i<b.length;i++){
			if(b[i]==1){
				count++;
			}
		}
		if(count==5) flag = true;
		return flag;
	}
	// 得到一个五位数字
	public static String values(int[] b){
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<b.length;i++){
			if(b[i]!=0){
				sb.append(i);
			}
		}
		return sb.toString();
	}
	// 反转 n
	public static int reverse(int n){
		StringBuffer sb = new StringBuffer();
		sb.append(n);
		sb.reverse();
		return Integer.parseInt(sb.toString());
	}
	// 进位得到下一个数字
	public static void modify(int[] b){
		b[b.length-1]++;
		for(int i=b.length-1;i>0;i--){
			if(b[i]>1){
				b[i] = 0;
				b[i-1]++;
			}
		}
	}
	public static void calc(String s){
		int n = Integer.parseInt(s);	// 得到一个五位数字
		int r = reverse(n);	// 反转 n
		if(r%n==0)	// 得到结果 n * ? = r
			System.out.println(n+"*"+(r/n)+"="+r);
	}
	public static void allSort(char[] c,int start,int end){
		char temp = 0;
		if(start==end){
			String s = new String(c);
			if((s.charAt(0)-'0')!=0){
				calc(s);	// 计算结果
			}
		}else{
			for(int i=start;i<=end;i++){
				temp = c[start];
				c[start] = c[i];
				c[i] = temp;
				allSort(c,start+1,end);
				temp = c[start];
				c[start] = c[i];
				c[i] = temp;
			}
		}
	}
	public static void f(int[] b){
		for(;;){
			if(check(b)) break;	// 检查是否是全111111...
			modify(b);	// 进位,进行下一个数字的测试
			if(!checkFive(b)) continue;	// 检查是否是一个五位数字
			String s =  values(b);		// 得到一个五位数字
			char[] c = s.toCharArray();
			allSort(c,0,c.length-1);	// 全排列其中一个五位数,并计算结果
		}
	}
	public static void main(String[] args){
		int[] b = new int[10];
		f(b);
	}
}

运行结果:

21978*4=87912

 

 

 

posted @ 2013-04-07 20:15  javawebsoa  Views(1441)  Comments(0Edit  收藏  举报