You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以优化方式在C语言中打印10×10行列的V形图案

10×10 V形图案打印优化方案

你当前的实现通过硬编码枚举所有星号坐标的方式写判断条件,代码冗余度高,扩展性极差,只要调整图案尺寸就需要重写全部条件分支。实际上只要提炼出星号位置的数学规律,完全可以用极少量的判断实现需求,甚至不需要逐列做条件检查。

坐标规律提炼

观察你代码中定义的V形星号位置,符合固定的数学关系:

  • 第1、3、5、7行(前4个奇数行):两个星号分别位于(行号+1)/2列、11-(行号+1)/2列,其余位置为空格
  • 第10行(V形尖点):仅第5列为星号,其余位置为空格
  • 第2、4、6、8、9行:整行均为空格

优化实现1(保留双层循环,简化判断)

把原来堆在if里的硬编码坐标全部替换为公式计算,只保留最核心的判断逻辑,不需要枚举每一个星点:

#include <stdio.h>

int main() {
    int row, col;
    for (row = 1; row <= 10; row++) {
        for (col = 1; col <= 10; col++) {
            int star_col = (row + 1) / 2;
            int match_pos = (row%2 == 1 && row <=7 && (col == star_col || col == 11 - star_col))
                          || (row == 10 && col == 5);
            putchar(match_pos ? '*' : ' ');
        }
        putchar('\n');
    }
    return 0;
}

优化实现2(无逐列判断,效率更高)

利用printf的宽度控制特性,直接计算每行星号的缩进位置输出,连内层逐列循环和判断都可以省略,代码更简洁:

#include <stdio.h>

int main() {
    int row;
    for (row = 1; row <= 10; row++) {
        if (row % 2 == 1 && row <= 7) {
            int offset = (row + 1) / 2;
            // %*c会自动填充对应数量的前置空格,直接定位星号位置
            printf("%*c%*c\n", offset, '*', 11 - 2*offset, '*');
        } else if (row == 10) {
            printf("%5c\n", '*');
        } else {
            printf("          \n"); // 空行直接输出10个空格
        }
    }
    return 0;
}

两个版本的输出和你原代码完全一致,都没有大量冗余的条件判断,后续如果需要调整V的大小,只需要修改循环上限和位置计算公式即可,不需要逐一枚举坐标。

内容的提问来源于stack exchange,提问作者Harsha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:03:17