习题 猜数字游戏提示

一.题目 实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B)。 输入包含多组数据。每组输入第一行为序列长度n,第二行是答案序列,接下来是若干猜测序列,猜测序列全0时该组数据结束。n=0时输入结束。 样例输入: 4 1 3 5 5 1 1 2 3 4 3 3 5 6 5 5 1 6 1 3 5 1 3 5 5 0 0 0 0 10 1 2 2 2 4 5 6 6 6 9 1 2 3 4 5 6 7 8 9 1 1 1 2 2 3 3 4 4 5 5 1 2 1 3 1 5 1 6 1 9 1 2 2 5 5 5 6 6 6 7 0 0 0 0 0 0 0 0 0 0 0 样例输出: Game 1: (1,1) (2,0) (1,2) (1,2) (4,0) Game 2: (2,4) (3,2) (5,0) (7,0)

二.分析 这道题的题意感觉有点复杂,刚开始没看懂,结合看了下分析,大概是知道题意了。 里面的思考比较简单,计算B那一步,从1~9的方法,比我自己认为的先标志答案的各个数字,再来一一对比临时数组,要方便很多,省去了很多复杂的步骤,以后应该考虑从大里面去提取数字,而不是直接精确的提取,这样可以省去很多思维上的曲折部分。

三.代码

#include <stdio.h>
#include<string.h>
int main ()
{
    int count=1;  //计算第几个Game
    int n;
    scanf("%d",&n);
    while(n!=0)
    {
        int i,j,temp;
        int target[1000];  //答案数组
        int tem[1000];     //临时数组
        int ok=0;         //判断tem 是否为全0  的标志
        int c1=0,c2=0;    //(1~9)分别代表在临时和答案数组中出现的次数
        int sumc1=0;      
        int A,B   ;      //A,B即为所求
        for(i=0;i<n;i++)
        {
            scanf("%d",&target[i]);
        }
        for(i=0;i<n;i++)
        {
            scanf("%d",&tem[i]);
        }
        printf("Game %d
",count);
        for(i=0;i<n;i++)
        {
            if(tem[i]!=0)
            {
                ok=1;break;//一个数不是0 就代表全部不是0
            }
        }
        while(ok)
        {
            A=0;B=0;sumc1=0;
            for(i=0;i<n;i++)
            {
                if(target[i]==tem[i])   A++;
            }
            for(i=0;i<10;i++)  //从1~9来判断
            {
                c1=c2=0;
                for(j=0;j<n;j++)
                {

                    if(target[j]==i)    c1++;
                    if(tem[j]==i)   c2++;
                }
                if(c1>c2)  c1=c2;  //取小值
                sumc1+=c1;         //1~9的小值数的和
            }
            B = sumc1-A;          //减去A,不要正确的位置
            printf("(%d,%d)
",A,B);   
            for(i=0;i<n;i++)
            {
                scanf("%d",&tem[i]);    
            }
            ok=0;       //标志数重新置0

            //重新循环判断作下一次的入口
            for(i=0;i<n;i++)
            {
                if(tem[i]!=0)
                {
                    ok=1;   
                    break;
                }
            }

        }
        scanf("%d",&n);
        if(n==0)    break;
        else count++;  //只有在n不等于0时,才开始下一次Game的计数count

    }
    return 0;
}

四.反思 debug大法好,一步步调试步骤值,可以比较快找出自己的失误部分.

经验分享 程序员 微信小程序 职场和发展