日期:2014-05-20  浏览次数:20873 次

求大神啊,3个java试题。求解!
6、有A、B、C、D和E共5所学校。在一次检查评比中,已知E肯定不是第2或第3名,他们互相进行推测,A校有人说,E校肯定是第1名;B校有人说,我校可能是第2名;C校有人说,A校最差;D校有人说,C校不是最好;E校有人说,D校会获得第一名。结果只有第一名和第二名的学校的人猜对了。编程指出这5所学校的名词。

7、有数字5、6、7、8、9,将五个数字任意组合成两个数字,比如57和689,每个数字不能重复使用,将组成的两个数字相乘,会得到一个乘积。请编程计算组成的哪两个数字的乘积最大。

8、将1-9这九个数字填入九个空格中,每一横行的三个数字组成一个三位数,如果要使第二行的三位数是第一行的两倍,第三行的三位数是第一行三位数的3倍,应该怎样填数?如下图所示:
 
1 9 2
3 8 4
5 7 6
java 编程

------解决方案--------------------
第3题不算太笨的方法

/**
 * 8、将1-9这九个数字填入九个空格中,每一横行的三个数字组成一个三位数,如果要使第二行的三位数是第一行的两倍,第三行的三位数是第一行三位数的3倍,
 * 应该怎样填数?如下图所示:
 * 
 * 1 9 2 
 * 3 8 4 
 * 5 7 6
 */
public class Test014 {
public static void main(String[] args) {
fun1();
}

static void fun1() {
for (int i = 129; i <= 327; ++i) {
if (i % 5 == 0)
continue;
String str = "" + i + i * 2 + i * 3;
if (check(str)) {
System.out.println("***find***");
System.out.println(i + "\n" + i * 2 + "\n" + i * 3);
}
}
}

static boolean check(String str) {
int[] arr = new int[10];
char[] chars = str.toCharArray();
for (char c : chars) {
++arr[c - '0'];
}
boolean result = true;
for (int i = 1; result && i < arr.length; ++i) {
result &= (arr[i] == 1);
}
return result;
}
}


------解决方案--------------------
第2题
答案是对的,不知道会不会出现什么异常情况,


/**
 * 7、有数字5、6、7、8、9,将五个数字任意组合成两个数字,比如57和689,每个数字不能重复使用,将组成的两个数字相乘,会得到一个乘积。
 * 请编程计算组成的哪两个数字的乘积最大。
 * 
 * 
 */
public class Test013 {
public static void main(String[] args) {
findMax();
}

static void findMax() {
int[] arr = new int[] { 9, 8, 7, 6, 5 };
int n1 = 0,n2 = 0;
for (int i : arr) {
if(n1 == 0) n1 = i;
else if(n2 == 0) n2 = i;
else if (n1 > n2) n2 = n2 * 10 + i;
else if (n1 < n2) n1 = n1 * 10 + i;
}
System.out.printf("%d * %d = %d", n1 ,n2 ,n1 * n2);
}
}


------解决方案--------------------
第一题写的有点小复杂

import java.util.Arrays;

/**
 * 6、有A、B、C、D和E共5所学校。在一次检查评比中,已知E肯定不是第2或第3名,他们互相进行推测,A校有人说,E校肯定是第1名;B校有人说,
 * 我校可能是第2名
 * ;C校有人说,A校最差;D校有人说,C校不是最好;E校有人说,D校会获得第一名。结果只有第一名和第二名的学校的人猜对了。编程指出这5所学校的名词。
 * 
 */
public class Test016 {

public static void main(String[] args) {
int[][] arr = getArr();
ranking(arr);
}

static int[][] getArr() {
int[][] arr = new int[5][5];
boolean[] booleanArr;
// 探测法,每次认为2个人说真话
for (int i = 0; i < 5; ++i) {
booleanArr = new boolean[5];
booleanArr[i] = true;
for (int j = i + 1; j < 5; ++j) {
booleanArr[j] = true;
if (check(booleanArr, arr)) {
//因为本题只会有唯一答案,所以找到就可以返回了
return arr;
}
booleanArr[j] = false;
}
}
return arr;
}

static boolean check(boolean[] booleanArr, int[][] arr) {
//判断条件
arr[0][4] = booleanArr[0] ? 1 : 0;
arr[1][1] = booleanArr[1] ? 1 : 0;
arr[4][0] = booleanArr[2] ? 1 : 0;
arr[0][2] = booleanArr[3] ? 0 : 1;
arr[0][3] = booleanArr[4] ? 1 : 0;
boolean result = true;
for (int i = 0; i < 2; ++i) {
int count = 0;
for (int j = 0; j < arr.length; ++j) {
//每个名次只有一个学校,并且前2名学校的人说的话与其学校名次匹配才为真
if (arr[i][j] == 1) {
result &= booleanArr[j];
++count;
}
}
result &= (count == 1);