《算法竞赛入门(第二版)》--java实现.3.2字符数组.猜数字游戏的提示

        之前没有发现这是一本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;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值