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

三重嵌套循环实现字母环绕图案打印问题求助

三重嵌套循环实现Z-A环绕字母图案问题

需求:使用三重嵌套循环打印字母图案,要求字母按Z→Y→X→…→A→Z→Y…的顺序环绕循环。已知输入'X'与6、'C'与4时有对应的正确输出示例。当前代码存在两个问题:

  • 每行的字母数量始终一致
  • 字母无法实现Z到A的环绕循环

原代码如下:

public class TriangleFive
{
   private char letter;
   private int amount;

    public TriangleFive()
    {
        this('a',0);
    }

    public TriangleFive(char c, int amt)
    {
        letter = c;
        amount = amt;
    }

    public void setLetter(char c)
    {
        letter = c;
    }

    public void setAmount(int amt)
    {
        amount = amt;
    }

    public String toString()
    {
        String output="";
        int count = 0;
        int castAscii = (int) letter - count;
        char ch = (char) castAscii;
        for(int i = 0; i< amount; i++){         // Rows

            for(int j = 0; j<amount -count; j++){    // Columns
                output += " ";

                for(int k  =0 ; k < amount -count; k++){    // Values in Columns
                    output +=  ch; 
                }
            }

            output += "\n";
            count++;
        }

        return output;
    }
}

问题分析

  1. 字母环绕逻辑缺失:原代码仅简单对初始字母做减法,未处理字母小于'A'时的环绕逻辑,无法实现Z到A的循环。
  2. 字母数量控制错误:原代码用amount - count同时控制列数和每列字母长度,导致每行所有列的字母数量一致,不符合图案要求的逐列递减规则。

修正后的代码

public class TriangleFive
{
   private char letter;
   private int amount;

    public TriangleFive()
    {
        this('a', 0);
    }

    public TriangleFive(char c, int amt)
    {
        letter = Character.toUpperCase(c); // 统一转为大写,避免大小写干扰
        amount = amt;
    }

    public void setLetter(char c)
    {
        letter = Character.toUpperCase(c);
    }

    public void setAmount(int amt)
    {
        amount = amt;
    }

    public String toString()
    {
        String output = "";
        // 第一层循环:控制总行数,共amount行
        for (int i = 0; i < amount; i++) {
            // 第二层循环:控制当前行的列数,每行递减1列
            for (int j = 0; j < amount - i; j++) {
                // 计算当前列的字母偏移量:行偏移+列偏移
                int offset = i + j;
                int charCode = (int) letter - offset;
                // 处理Z-A环绕:若小于'A'则加26回到Z方向
                if (charCode < 'A') {
                    charCode += 26;
                }
                char currentChar = (char) charCode;

                // 第三层循环:控制当前列的字母重复次数,逐列递减
                for (int k = 0; k < amount - i - j; k++) {
                    output += currentChar;
                }
                // 列间添加空格(避免行尾多余空格)
                if (j != amount - i - 1) {
                    output += " ";
                }
            }
            // 每行结束换行
            output += "\n";
        }
        return output;
    }
}

关键修改点

  1. 环绕逻辑实现:通过计算字母ASCII码,当结果小于'A'时加26,实现从A回到Z的循环,满足Z→A的环绕要求。
  2. 字母数量调整:第三层循环次数改为amount - i - j,使得每一行的列数逐行递减,每一列的字母数量逐列递减,符合图案规则。
  3. 列间空格处理:在列之间添加分隔空格,同时避免行尾出现多余空格。
  4. 统一大写:将输入字母转为大写,避免大小写混合导致的ASCII码计算错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:37:39