习题 猜数字游戏提示
一.题目 实现一个经典“猜数字”游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确(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大法好,一步步调试步骤值,可以比较快找出自己的失误部分.
