补充:
核心概念:变量 vs. 地址
1. 字符变量(char 类型)
-
它是一个小盒子 ,专门用来存放一个字符 (比如
'a'、'b'、'9')。 -
例如:
char c;定义了一个小盒子,你可以往里放东西:c = 'a'; -
这个小盒子只能放字符本身,不能放位置信息。
2. 数组名(如 char s[100] 中的 s)
-
数组名代表的是整个数组的首地址 ,也就是第一个元素在内存中的门牌号 (比如
0x7ffd1234)。 -
它告诉你"数组从哪个位置开始",但它本身不是字符 ,而是一个地址值。
类比理解
想象一排有编号的信箱(数组):
-
信箱本身有地址(比如 101 号、102 号......),这些地址是固定的。
-
每个信箱里可以放一封信(字符)。
-
数组名
s就相当于"这排信箱的起始门牌号 101"。 -
s[0]就是 101 号信箱里放的那封信。 -
s[0] = s就相当于:把"101 号"这个门牌号本身,塞进 101 号信箱里------这显然不合理,信箱里只能放信,不能放门牌号。
总结
-
数组名 = 地址(门牌号),不能放进字符变量里。
-
数组元素 = 实际存储的数据(信箱里的信),用
数组名[下标]访问。 -
记住:
s不是字符,s[0]才是第一个字符。
下次再遇到类似问题,可以想想这个"信箱 vs. 门牌号"的比喻,就不容易混淆了。
攻击次数
问题描述
小蓝正在玩一个游戏,游戏中小蓝要控制自己的三个英雄来攻击一个敌人。敌人初始的血量为 2025。
小蓝的第一个英雄攻击力恒定,每回合攻击 5 的血量。
小蓝的第二个英雄拥有一些技能,奇数回合触发,攻击 15的血量,偶数回合攻击 2的血量。
小蓝的第三个英雄拥有一些道具,当回合数除以 3 的余数为 1 时攻击 2 的血量;当回合数除以 3 的余数为 2 时攻击 10 的血量;当回合数除以 3 的余数为 0 时攻击 7 的血量。
游戏从第 1 回合开始。不考虑敌人对小蓝英雄的攻击,敌人的血量也仅受攻击的影响。如果敌人的血量小于等于零,则游戏结束。
请问到第几回合游戏结束?
输入格式
无。
输出格式
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只需要编写一个程序输出这个整数,输出多余的内容将无法得分。

解答:
**小心:**血量是整数,每回合总伤害是三个英雄之和。我们要求的是第几回合结束,即当血量<=0时的回合编号。
让我们模拟一下。初始血量H=2025。回合数t从1开始,每回合减去总伤害,直到H<=0,输出t。
但注意:游戏结束是在该回合攻击后血量<=0,所以该回合就是结束回合。
我们可以手动计算或编程。由于这里要求解析,我们可以写一个程序思路。
我们计算每回合总伤害:
-
对于回合t:
英雄1: 5
英雄2: 如果t奇数则15,偶数则2
英雄3: 如果t%3==1则2,t%3==2则10,t%3==0则7
所以总伤害 = 5 + (t奇数?15:2) + (t%3==1?2: t%3==2?10:7)
简化:
令a = t%2?15:2
令b = t%3==1?2: t%3==2?10:7
总伤害 = 5+a+b
我们需要累计直到超过2025。由于可能循环,我们可以用程序,但这里手动计算也可以,不过需要小心。因为2025不大,我们可以用循环思想。
由于问题要求输出整数,我们可以直接写一个C程序。
注意:在代码中,我们用while循环,t从1开始(为真,当为假则跳出循环。),每次减去伤害,当H<=0时输出t。
让我们在脑中模拟一下?可能有点长,但我们可以计算平均伤害,然后估计。不过为了精确,最好编程。
由于这里是文本交互,我可以模拟一下。所以需要手动计算或推理。
让我们手动计算:我们可以先找出周期。因为三个英雄的伤害模式依赖于t的奇偶和除以3的余数,所以周期可能是6(因为2和3的最小公倍数为6)。每个周期6回合的伤害可以计算。
计算1到6回合的伤害:
t=1: 奇数,余1 => a=15, b=2 => 总=5+15+2=22
t=2: 偶数,余2 => a=2, b=10 => 总=5+2+10=17
t=3: 奇数,余0 => a=15, b=7 => 总=5+15+7=27
t=4: 偶数,余1 => a=2, b=2 => 总=5+2+2=9
t=5: 奇数,余2 => a=15, b=10 => 总=5+15+10=30
t=6: 偶数,余0 => a=2, b=7 => 总=5+2+7=14
所以6回合总伤害 = 22+17+27+9+30+14 = 我们来加:22+17=39,39+27=66,66+9=75,75+30=105,105+14=119。所以每6回合总伤害119。
那么2025除以119:119*17=2023?因为119*17=119*10=1190,119*7=833,总和2023。所以17个周期(17*6=102回合)后,总伤害2023,剩余血量2025-2023=2。然后第103回合开始。注意第103回合是第17个周期后的下一回合。我们需要看第103回合的伤害能否把剩余2点血打掉。
第103回合:我们需要知道它在周期中的位置。因为周期6,103除以6余数?6*17=102,所以103是第102+1,即周期中的第1回合(因为余1)。第1回合伤害是22,大于2,所以第103回合后血量<=0。因此游戏在第103回合结束。
但我们需要确认是否计算正确?因为17个周期后剩余2,那么第103回合伤害22,打完剩余-20,所以结束在第103回合。
但注意:我们是否考虑第1回合是从1开始,所以第103回合就是第103。所以答案是103。
然而,我们需要验证17个周期是否准确?17*119=2023,没错。2025-2023=2。所以答案应该是103。
但为了保险,我们可以再检查一下有没有可能因为周期起始不同?因为我们的周期是从1到6计算的,而第103回合是第1种,伤害22,没问题。
因此,结果就是103。
代码结构解析
#include <stdio.h> int main() { int hp = 2025; // 敌人初始血量 int round = 1; // 从第1回合开始 while (1) { // 无限循环,直到血量≤0时跳出 int damage = 5; // 英雄1每回合固定攻击5点 // 英雄2的伤害:根据回合奇偶性 if (round % 2 == 1) damage += 15; // 奇数回合加15 else damage += 2; // 偶数回合加2 // 英雄3的伤害:根据回合数除以3的余数 if (round % 3 == 1) damage += 2; // 余1加2 else if (round % 3 == 2) damage += 10; // 余2加10 else damage += 7; // 余0(整除)加7 hp -= damage; // 扣除本回合总伤害 if (hp <= 0) { // 如果血量≤0,游戏结束 printf("%d\n", round); // 输出当前回合数 break; // 退出循环 } round++; // 否则进入下一回合 } return 0; }
为什么这样写?
1. 直接模拟游戏过程
题目要求计算到第几回合敌人血量归零,最直观的方法就是逐回合模拟:从第1回合开始,每回合累加三个英雄的攻击力,从初始血量中扣除,直到血量≤0。这种"暴力"模拟虽然简单,但完全符合题意,且由于血量不大(2025),循环次数有限,不会造成性能问题。
2. 变量设计清晰
hp记录敌人当前剩余血量,初始为2025。
round记录当前回合数,从1开始,每回合结束后自增。
damage是本回合三个英雄造成的总伤害,先赋值为英雄1的固定值5,再依次加上英雄2和英雄3的伤害。3. 伤害计算完全对应规则
英雄2 :用
round % 2判断奇偶,奇数回合加15,偶数加2。英雄3 :用
round % 3判断余数,根据余数分别加2、10、7。注意C语言中%运算结果非负,所以余数0、1、2正好对应三种情况。4. 循环终止条件
当
hp <= 0时,表示本回合攻击后敌人血量归零或以下,游戏结束,此时输出当前回合数并跳出循环。注意判断是在扣血之后,所以输出的回合就是最后一击的回合。5. 无需考虑其他因素
题目明确"不考虑敌人对小蓝英雄的攻击",且敌人血量仅受攻击影响,所以只需单纯累减即可,无需复杂逻辑。
