1. 二分法猜数字有效,Ubuntu
玩法:我先出一个数字,告诉你们是几位数的数字,建议不超过2位,然后让别人轮流猜,猜错了就罚喝酒,下一个继续猜,最后谁猜对了就当地主写答案,开始下一轮
以两位数为例:我写一个答案32,捂住,不给别人看,然后让别人猜
如果一个数字都没猜中,我就说一个数字也没说对 (0A 0B)
如果猜中了一个数字,但是位置不对,我就说猜中了一个数字,但是位置不对(0A 1B)
如果猜中了一个数字,而且位置是对的,我就说猜中了一个数字,而且位置是对的(1A 0B)
如果猜中了二个数字,但是位置是错的,我就说猜中了两个数字,但是位置不对(2A 0B)
那下一个人捡便宜了,换一个位置就对了
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 生成 n 位不重复的随机数
void generateRandomNumber(int* nums, int n) {
int i, j, t;
srand(time(NULL));
for (i = 0; i < n; i++) {
// 保证不重复
do {
t = rand() % 10;
for (j = 0; j < i; j++) {
if (nums[j] == t) {
break;
}
}
} while (j < i);
nums[i] = t;
}
}
// 判断两个数是否匹配,并返回 A 和 B 的数量
void judge(int* ans, int* guess, int n, int* a, int* b)
{
int i, j;
*a = *b = 0;
for (i = 0; i < n; i++) {
if (ans[i] == guess[i]) {
(*a)++;
} else {
for (j = 0; j < n; j++) {
if (ans[i] == guess[j]) {
(*b)++;
break;
}
}
}
}
}
int main()
{
const int MAX_CHANCES = 10; // 最多猜测次数
int nums[10], ans[10], guess[10];
int n, m, i, j;
// A 和 B 是用来表示用户每次猜测结果的两个参数。其中,
// A 表示位置正确且数字正确的数位个数;B 表示数字正确但位置不正确的数位个数。
// 比如,如果答案是 1234,而用户猜测的数字是 1342,则猜测结果为 1A2B,即数字 1 的位置正确且数字正确,而数字 3 和 4 的位置不正确但数字是正确的。
int a;
int b;
char input[20];
// 输入随机数位数
printf("请输入随机数的位数:");
fgets(input, sizeof(input), stdin);
n = atoi(input);
// 随机生成待猜测数字
generateRandomNumber(ans, n);
printf("已经生成了一个 %d 位的随机数,请开始猜测:", n);
// 开始猜测
for (m = 1; m <= MAX_CHANCES; m++) {
printf("\n第 %d 次猜测:", m);
fgets(input, sizeof(input), stdin);
for (i = 0; i < n; i++) {
guess[i] = input[i] - '0';
}
judge(ans, guess, n, &a, &b);
if (a == n) { // 猜中了
printf("恭喜你,猜对了!\n");
break;
} else {
printf("%d A %d B\n", a, b);
}
}
if (m > MAX_CHANCES) { // 次数用完了
printf("很遗憾,没有猜中。正确答案是:");
for (i = 0; i < n; i++) {
printf("%d", ans[i]);
}
}
return 0;
}