C语言函数题,请问为什么答案中给出计算机剩余数的个数使用s表示而不是30-s?

题目是:两方从1开始轮流报数,每次每方可报一个或两个连续的数,谁先报到30,谁胜利。首先生成一个随机数来确定谁先报数。其中计算机报数的原则是:若剩下数的个数除以3,余数为1,则报一个数;若剩下数的个数除以3余数为2则报两个数。否则随机报一个或两个数。请编程实现这个游戏:答案给出代码如下,请问答案为什么用s而不是30-s表示剩余数个数?
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int Input(int t);
int ControlComputer(int s);
int Rnd();
int main()
{
int tol = 1;
if (Rnd() == 1)
{
tol = Input(tol);
}
while (tol < 30)
{
tol = ControlComputer(tol);
if (tol == 30)
{
printf("Player lose\n");
}
else
{
tol = Input(tol);
if (tol >= 30)
{
printf("Computer lose\n");
}
}
}
printf("Game Over");
return 0;
}
int Input(int t)
{
int a;
do {
printf("please count\n");
scanf("%d", &a);
if (a > 2 || a < 1) {
printf("Error input\n");
}
else
{
printf("you count is %d\n", t + a);
}
} while (a > 2 || a < 1);
return t + a;
}
int ControlComputer(int s)
{
int c;
printf("computer count\n");
if ( s% 3 == 1)
{
s++;
printf("%d\n", s);
}
else if (s % 3 == 2)
{
s += 2;
printf("%d\n", s);
}
else
{
c = Rnd() + 1;
s += c;

printf("%d\n", s);
}
return s;
}
int Rnd()
{
srand(time(NULL));
return rand() % 2;
}

在给出的代码中,答案中使用变量名"s"来表示剩余数的个数,而不是使用"30-s",是因为在游戏过程中,不需要使用"30-s"来表示剩余数的个数,而是通过变量"s"来记录剩余数的个数。
代码中的变量"s"代表剩余数的个数,它在游戏进行过程中是动态变化的。每次玩家报数或计算机报数后,剩余数都会相应减少。使用"s"作为变量名,能够直观地表示游戏进行时的剩余数,更易于理解和处理。
而"30-s"并没有直接对应到游戏规则中的剩余数,它只是一个固定的数值30减去s的值,并没有实际意义。在这个游戏中,剩余数的个数是动态变化的,不同阶段都有不同的数值,所以没有必要使用固定的数值"30-s"来表示剩余数的个数。
因此,使用变量"s"来表示剩余数的个数是更加合适和实用的做法,可以根据游戏规则和动态变化的剩余数进行相应的计算和处理。追问

可是s变化,30-s不也就跟着动态变化吗

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-07-27
在给出的代码中,计算机剩余数的个数应该是采用30 - s 的表示,而不是只用 s。
事实上,我们可以看到在 ControlComputer 函数中,s 是作为参数传递给函数的,表示剩余数的个数。当计算机报数时,根据游戏规则,它应该根据剩余数的个数 s 来判断报数的方式。所以在计算机报数的逻辑中,应该使用 s 而不是 30 - s。
在代码中,根据剩余数计算计算机报数个数的方式分为三种情况:剩余数除以3的余数为1时报一个数、为2时报两个数,其他情况随机报一个或两个数。但是这些判断都是根据剩余数(s)计算的,而不是30 - s。
所以,答案给出的代码中应该使用 s 表示剩余数的个数,而不是 30 - s,以满足计算机根据剩余数来判断报数方式的逻辑。
假设
如果我们使用30-s来表示剩余数的个数,那么变量s的含义会变得模糊不清,代码的可读性和理解性会大大受到影响。因此,为了代码的清晰和易读性,选择使用s来表示剩余数的个数是更好的选择。追问

请问剩余数为什么用s表示呢?

追答

根据代码的逻辑,s并不是表示剩余的数个数。实际上,s代表的是当前玩家或计算机所报的数。
在ControlComputer函数中,根据当前剩余的数个数s的模3来决定计算机报数的策略。如果s%3为1,表示剩余数个数除以3余数为1,计算机报一个数。如果s%3为2,表示剩余数个数除以3余数为2,计算机报两个数。其他情况下,计算机根据随机数决定报一个或两个数。
所以,s是根据当前剩余的数个数来确定计算机报数的策略,并不是表示剩余的数个数。

追问

您这话我有点没太搞懂 一会儿“s并不是表示剩余的数的个数”,一会儿“根据当前剩余的数的个数s”所以到底是什么意思?

第2个回答  2023-07-27
在这个游戏中,每轮报数结束后,剩余数 的个数都会增加1。因此,我们可以使用 变量s来表示当前剩余数的个数,而不是 使用30-s。
当剩余数的个数为s时,我们需要判断应 该如何报数。如果s是1的倍数,我们可 以选择报一个数;如果s是2的倍数,我 们可以选择报两个数;否则,我们随机报 一个或两个数。
使用s来表示剩余数的个数可以让代码更 加简洁易懂,因为我们不需要在每次报数 后重新计算剩余数的个数。同时,使用s 也可以让代码更加灵活,因为我们可以根 据实际情况来调整报数策略,比如在剩余 数个数较少时,我们可以选择报一个数, 以增加获胜的机会。
综上所述,使用s来表示剩余数的个数是 一种更加简单和灵活的方法。追问

请问为什么“每次报数结束后,剩余数的个数都会增加1”啊?不应该是每次报数结束后剩余数的个数都会减少吗?

第3个回答  2023-07-26
注意这段核心逻辑
if ( s% 3 == 1)
{
s++;
printf("%d\n", s);
}
else if (s % 3 == 2)
{
s += 2;
printf("%d\n", s);
}
else
{
c = Rnd() + 1;
s += c;
}
这段逻辑应该和题意不符,若剩下数的个数除以3,余数为1,则报一个数;若剩下数的个数除以3余数为2则报两个数。
用s的话,就是反过来s 和 30-s的余数,1和2是反的,因此按照题意,computer是必胜的,而实际程序则player是必胜的。
第4个回答  2023-07-25
这么长的代码让别人肉眼看出来是很麻烦的,还不如自己单步跟跟看看s值变化情况,分析它得到的过程。反正单步调试也是必须学会的技能
相似回答