C# 仅用 for 循环打印对称三角形
在 C# 编程中,如何仅用一个 for 循环打印出完整的对称三角形?本文展示利用 string 构造函数简化输出逻辑的代码实现。
问题与目标
这是一道常见的编程面试题:要求在只允许使用一个 for 循环的前提下,在控制台输出一个对称的空心或实心三角形图案。如果使用嵌套循环可以轻松实现,但单循环模式需要更巧妙的算法逻辑。
准备条件
- 环境要求:.NET Framework 或 .NET Core/5+ 的任意版本支持。
- 核心工具:System命名空间下的
Console.WriteLine方法以及字符串处理功能。
第1步:理解核心技巧 —— 字符串快速复用
C# 提供了 string(char ch, int repeatCount) 的重载构造函数,可以一次性生成指定数量的重复字符。这比在循环内逐个拼接字符要高效且简洁得多。
语法示例:
new string('*', 5) // 结果: *****
这是解决本题的关键,它将原本可能需要内部循环填充字符的操作,压缩为单次赋值。
第2步:构建单循环逻辑
为了在一个循环内控制三角形的形状(先上升后下降),我们需要将行数 i 映射为每行的宽度。假设总行数为 N:
- 上半部分(第 1 至 N/2 行):行数
i直接对应宽度增量。 - 下半部分(第 N/2 + 1 至 N 行):宽度开始递减。
通过以下逻辑获取当前行实际需要的“峰值”高度 tmpRow:
tmpRow = (i <= rowNum / 2) ? i : (rowNum - i + 1);
得到 tmpRow 后,星星的数量计算公式为 2 * tmpRow - 1。此公式可确保每行都是奇数个星星,从而保持图形的居中对称性。
第3步:完整代码实现
以下是封装好的完整类与方法。输入参数 rowNum 控制三角形的大小,函数会自动验证输入的有效性。
using System;
using System.Text.RegularExpressions;
namespace TrianglePrinter
{
class Program
{
static void Main(string[] args)
{
// 执行打印,参数 19 代表总行数为 19
Render(19);
Console.Read();
}
/// <summary>
/// 打印对称三角形
/// </summary>
static void Render(int rowNum)
{
// 参数校验:必须为正整数
if (rowNum <= 0 || !Regex.IsMatch(rowNum.ToString(), @"^\d+$"))
{
return;
}
int tmpRow = 0;
// 关键:仅使用单层 for 循环
for (int i = 1; i <= rowNum; i++)
{
// 计算当前行的基准高度:前半段递增,后半段递减
tmpRow = (i <= rowNum / 2) ? i : (rowNum - i + 1);
// 利用字符串构造函数直接生成该行内容
// 2 * tmpRow - 1 保证了星星数量为奇数,从而实现对齐
Console.WriteLine("{0}", new string('*', 2 * tmpRow - 1));
}
}
}
}
代码原理解析
- 数学映射:
Math.Abs(N / 2 + 1 - i) * 2 + 1是另一种常见的写法,上面的三目运算符写法同样能达到“山峰”效果,使图形上下对称。 - 效率优化:传统的做法是在每一行使用内部循环打印空格和星星。本方法通过
new string(...)跳过了逐字符处理的开销,使得单次遍历即可完成整行渲染。
完成判断
运行代码后,控制台应从上到下依次显示行数逐渐增加、随后减少的星号序列,且所有行在视觉上居中对齐,形成完美的等腰三角形轮廓。
简要总结
利用 C# 的字符串构造函数结合简单的线性代数逻辑,可以在不牺牲性能的情况下,极大地简化循环结构。这种“以数据替代迭代”的思路在很多图像处理及格式化输出的场景中都非常实用。以上就是C#用for语句输出一个三角形的方法的详细内容,更多关于C#基础算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













