标签:数字 int Mind sum2 sum1 次数 序列 例题 Hints
实现一个经典"猜数字"游戏。给定答案序列和用户猜的序列,统计有多少数字位置正确
(A),有多少数字在两个序列都出现过但位置不对(B)。
输入包含多组数据。每组输入第一行为序列长度n,第二行是答案序列,接下来是若干
猜测序列。猜测序列全0时该组数据结束。n=0时输入结束。
样例输入:
4
1 3 5 51 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)
思路:对比每一位是否相同,相同则 sum1++
因为要轮流比较出现的相同数字,不如求出1~9每个数字出现的次数,存在以该数字为下标的数组(N[ ] Z[ ])中,然后比较样例数字出现的次数,将共同出现的次数(也就是min(N[i]), Z[i])全部存在 sum2 中
假如全部猜错则次数为 sum2次
猜对的次数为 sum1 次
所以实际猜错的次数为 sum2 - sum1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int Nnum[10], Znum[10];//存1~9每个数字出现的次数
int N[1005], Z[1005];
int minn(int a, int b){//返回同一个数字出现最少的次数(共同出现的次数)
if(a == 0 || b == 0)return 0;
return a > b ? b : a;
}
int main(){
int n;
int sum1, sum2;
int cnt = 0;
while(scanf("%d", &n) == 1 && n){
sum1 = sum2 = 0;
memset(Nnum, 0, sizeof(Nnum));
for(int i = 1; i <= n; i++){
scanf("%d", &N[i]);
Nnum[N[i]]++;
}
printf("Game %d:\n", ++cnt);
while(1){
sum2 = 0;
sum1 = 0;
memset(Znum, 0, sizeof(Znum));
for(int i = 1; i <= n; i++){
scanf("%d", &Z[i]);
Znum[Z[i]]++;
if(Z[i] == N[i])sum1++;//猜对的次数
}
if(!Z[1]) break;
for(int i = 1; i <= 9; i++){
sum2 += minn(Nnum[i],Znum[i]);//猜错的次数
}
printf(" (%d,%d)\n", sum1, sum2-sum1);
}
}
return 0;
}
标签:数字,int,Mind,sum2,sum1,次数,序列,例题,Hints 来源: https://blog.csdn.net/zhiai_/article/details/115644353
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。