C语言基础之蓝桥杯

补充:

核心概念:变量 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. 无需考虑其他因素

题目明确"不考虑敌人对小蓝英雄的攻击",且敌人血量仅受攻击影响,所以只需单纯累减即可,无需复杂逻辑。


相关推荐
Sunhen_Qiletian1 小时前
OpenCV中透视与仿射变换的区别——从矩阵到实战的全面解析
opencv·算法·矩阵
程序员阿鹏1 小时前
73.矩阵置零
数据结构·算法·矩阵
Eloudy2 小时前
CHI 开发备忘 12 记 -- CHI spec 12 链路层
人工智能·算法·arch·hpc
老师好,我是刘同学2 小时前
贪心算法与优先队列实战解析
算法·ios·贪心算法
智者知已应修善业2 小时前
【51单片机8位密码锁】2023-2-22
c语言·经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
一叶落4382 小时前
LeetCode 191. 位1的个数(Hamming Weight)——三种解法详解(C语言)
c语言·数据结构·算法·leetcode
满分观察网友z2 小时前
刷 LeetCode 看不懂题解?我做了一个能"播放"算法的开源可视化平台
前端·算法·leetcode
liu****2 小时前
4.哈希扩展
c++·算法·哈希算法·位图·bitset
Σίσυφος19002 小时前
PCL聚类 之K-Means
算法·kmeans·聚类