1. 问题背景与需求分析
这道题目来自蓝桥杯第十六届C组程序设计竞赛的C题,要求我们编写一个程序,根据输入的高度h和宽度w,输出一个由"2025"四个字符循环组成的矩阵图案。这个图案的特点是每一行都相对于上一行向左移动一位,形成一种斜向循环的效果。
1.1 题目示例解析
以样例输入4 5为例:
- 第一行输出:20252
- 第二行输出:02520
- 第三行输出:25202
- 第四行输出:52025
可以看到,每一行都是"2025"这个基础字符串的循环,且每一行的起始字符相对于上一行向后移动了一位(即上一行的第二个字符成为本行的第一个字符)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案设计
2.1 核心思路
解决这个问题的关键在于如何高效地实现字符串的循环输出和行间偏移。我们可以利用模运算(%)的特性来实现这一需求。
2.1.1 模运算的应用
模运算(取余运算)有一个重要特性:它可以将无限大的整数映射到一个有限的范围内。例如,对于任何整数n,n%4的结果只能是0、1、2或3。这正好对应了"2025"这个长度为4的字符串的各个字符位置。
2.2 算法设计
2.2.1 函数分解
我们将解决方案分解为两个主要部分:
- 主函数(main):负责接收输入参数并控制整体流程
- 打印函数(draw2025):负责具体每一行的输出
2.2.2 关键算法
在draw2025函数中,我们使用以下表达式来确定每个位置应该输出哪个字符:
c复制base[(i+j) % baselen]
其中:
- i是行号(从0开始)
- j是列号(从0开始)
- baselen是基础字符串的长度(这里是4)
3. 代码实现详解
3.1 基础字符串定义
c复制const char base[] = "2025";
int baselen = strlen(base);
这里我们定义了基础字符串"2025"并计算其长度。使用const确保字符串不会被意外修改。
3.2 draw2025函数实现
c复制void draw2025(int i, int w) {
const char base[] = "2025";
int baselen = strlen(
