之前没有发现这是一本C语言编写得书,但本人还未学习过C语言,只能尝试用java实现书中的代码,在此记录学习这本书的历程。
本人新手菜鸟,能力有限,如果有误或者有改进的地方欢迎指出,谢谢\(▔▽▔)/。
题目:实现一个经典的“猜数字”游戏。给定答案序列和用户猜测的序列,统计有多少数字位置正确(A),有多少数字在两个序列中都出现过但位置不对(B)。
输入包含多组数据。每一组输入第一行为序列长度n,第二行是答案序列,接下来是猜测序列。猜测序列全为0是该数据结束。n=0时结束输入。(答案、猜测数据中不包含0)
/*
如何计算数字在两个序列都出现过但位置不对
分别计算各个数字在a和b中出现的次数,相同的数字是一一对应的,所以取出现次数少的(多的数字没有对应的)
然后再减去位置相同的情况即可得到位置不同的数字的对数
*/
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int begin;
int kase = 0;
while(input.hasNextLine() && (begin = input.nextInt()) != 0) {
kase++;
System.out.println("Game"+kase+" :");
input.nextLine();
int []a = makeNumber(input.nextLine(),begin);
int []b;
for(;;) {
int A = 0; //a、b间出现位置相同数字相同的一一对应的数字的对数
int B = 0; //a、b间出现的可以一一对应的数字的对数
b = makeNumber(input.nextLine(),begin);
if(b[0] == 0) {
break;
}
for(int i = 0;i < begin;i++) {
if(a[i] == b[i]) { //统计位置相同的相同数字的对数
A++;
}
}
for(int n = 1;n <= 9;n++) {
int c1 = 0;
int c2 = 0;
for(int k = 0;k < begin;k++) {
if(a[k] == n) {
c1++;
}
if(b[k] == n) {
c2++;
}
}
B += Math.min(c1, c2); //统计可以一一对应的数字的对数
}
System.out.println("(" + A + "," + (B - A) + ")");
//System.out.printf("(%d,%d)",A,B-A);
}
}
}
//将数字放入数组中,同示例代码中的scanf
public static int[] makeNumber(String line,int number) {
int []a = new int[number];
Scanner inputs = new Scanner(line);
int count = 0;
while(inputs.hasNextInt()) {
a[count++] = inputs.nextInt();
}
return a;
}