和女朋友坐一块的时候,突然想到了,哈哈哈哈哈

不会很难!!!

import java.util.*;import java.lang.Math;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        /**思考过程如下:        小三角形个数为 3^(n-1)        1 3 9 27        3^(1-1) = 1        3^(2-1) = 3        3^(3-1) = 9        3^(4-1) = 27        3^(5-1) = 81        // 去除杆子有多少层用到了        n        3x1    3       3*2^(1-1)        3x2    6       3*2^(2-1)        3x4    12        3x8    24        3x16   48        int allP = 3 * (int)Math.pow(2, n - 1);                最底层三角形个数                没用到        n        1   1   0+1             2^(n-1)        2   2   1+1                     3   4   2+1+1        4   8   4+2+1+1        5   16  8+4+2+1+1        6   32  16+8+4+2+1+1        int lastPT = Math.pow(2, n - 1)        最底层宽度  最底层三角形个数*6   用到了        n        1 6           2 12          3 24        4 48        5 96        int lastPW = (int)Math.pow(2, n - 1) * 6;        24 - 3 - 12 - 0        左边宽 最底层宽度 - 6 / 2  每三行-3   用到了        1 0        2 3-0        3 9-6-3-0        4 21-18-15-12-9-6-3-0        int leftW = (lastPW - 6) / 2;        最底层判断          需要        int nowP = 0;        int lastP = 3;        int checkN = 1;        if nowP = lastP            checkN++;            lastP += lastP        第几层,三角形大间隔    当checkN>2时,存在大间隔     最大间隔等于上一层最底层宽度-6!!!!用到了!        int triW = 0;   // 初始值        if (nowP == lastP) {            checkN++;            lastP += lastP;            if (checkN > 2) {                triW = ((int)Math.pow(2, checkN - 2) - 1) * 6;          //<----用到了这个            }            starN = 2;   // "  *   "、" * *  "、"* * * "每层数量            starP = 0;   // 输出了几层了        }        n        1 0        2 0        3 6-0       每三行-6                 4 18-12-6-0                         5 42-36-30-24-18-12-6-0             if (nowP % 3 == 0) {            triW -= 6;            leftW -= 3;        }        // "  *   "、" * *  "、"* * * "每层        starN = 2   // "  *   "、" * *  "、"* * * "每层数量        starP = 1   // 输出了几层了        if (starP % 4 == 0) starN *= 2;        // 星与星间距        2 2 2       3   3*1        4        4 4 4       6   3*2        4 4 4       9   3*3        10        8 8 8       12  3*4        8 8 8       15  3*5        16        16 16 16    18  3*6        16 16 16    21  3*7        22        32 32 32    24  3*8        int starW = (lastPW - starN * 6 - leftW - triW) / 2;                    24 - 12 - 3 - 6         */  /*观察例子,可以发现,从n=2开始左右树两边都是前者各层的形状,故直接计算好整体左边和左右两边树间距即可实现了*/                int n = in.nextInt();        int lastPW = (int)Math.pow(2, n - 1) * 6;                   // 最底层宽度        int leftW = (lastPW - 6) / 2;                               // 左边宽 每三层-3        int allP = 3 * (int)Math.pow(2, n - 1);                     // 去除杆子的总层数        int checkN = 1;                                             // 检测n,每个n对应的层数        int starW = 0;                                              // 左右两边间距        int starP = 0;                                              // 统计每新的开始输出几层了        String[] treeData = new String[allP + n];                   // 树        for (int i = 1; i <= allP; i++) {            for (int j = 0; j < leftW; j++) System.out.print(" ");// 输出左边宽            if (i < 4) {// 相当于一个初始化的过程                String putStr = "";                if (i == 1) {                    // "  *   "                    putStr = "  *   ";                } else if (i == 2){                    // " * *  "                    putStr = " * *  ";                } else {                    // "* * * "                    putStr = "* * * ";                }                treeData[i - 1] = putStr;                System.out.print(putStr);            } else {// 开始输出前者的内容                StringBuilder putStr = new StringBuilder();                for (int j = 0; j < 2; j++) {// 左右                    putStr.append(treeData[starP]);                    if (j == 0) {                        // 输出间距                        for (int k = 0; k  2) {                    starW = (int)Math.pow(2, checkN - 2) * 6 - 6;// 左右两边树的间距计算                }            }        }        // 杆子        int leftTW = (lastPW / 2) - 1;        for (int i = 0; i < n; i++) {            for (int j = 0; j < leftTW; j++) {                System.out.print(" ");            }            System.out.println("*");        }    }}

下面附图进一步理解:

最后,感谢你阅读我的文章,感恩!!!