如何以优化方式在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
相关产品推荐
相关产品推荐

