#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> //最大输入数为 8 #define ROW 128//定义计算数组行数 #define COL 130//定义计算数组列数 //定义输出数组行列 #define ROWS 384 #define COLS 767 //初始化计算数组 void Setcal(short arr[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j <= i + 2; j++) { arr[i][j] = 1; } } } //初始化输出数组 void Setshow(char arr[ROWS][COLS], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { arr[i][j] = ' '; } } } //计算过程(默认第一行除了中间的一个-1其他都为1) //计算原理: //.. 1 1 -1 1 1 ... // \ / \ / \ / \ / 相乘 // ..1 -1 -1 1.. // \ / \ / \ / \ / \ / //..1 -1 1 -1 1... //1 -1 -1 -1 -1 1 // ...... //共3 * 2^(N-1)行 //每一个-1对应一个基础三角 //即: * // * * // * * * //即为预期输出图形 void Calculate(short arr[ROW][COL], int row, int col) { arr[0][1] = -1; for (int i = 1; i < row; i++) { for (int j = 1; j <= i + 1; j++) { arr[i][j] = arr[i - 1][j - 1] * arr[i - 1][j]; } } } //根据计算数组所得结果更改输出数组 void Change(char arr2[ROWS][COLS], short arr1[ROW][COL], double row, double col, double n) { for (int i = 0; i < (int)row; i++) { for (int j = 1; j < (int)col; j++) { if (arr1[i][j] == -1) { //将计算数组算出的值为-1的点对应到输出数组中每一个基础三角形的顶点 int i1 = 3*i; int j1 = 6 * (j - 1) + 3 * pow(2, n - 1) - 1 - 3 * i; //从顶点开始将基础三角形元素换成 '*' 符号 arr2[i1][j1] = '*', arr2[i1 + 1][j1 - 1] = '*', arr2[i1 + 1][j1 + 1] = '*', arr2[i1 + 2][j1 - 2] = '*', arr2[i1 + 2][j1] = '*', arr2[i1 + 2][j1 + 2] = '*'; } } } } //打印输出数组 void Display(char arr[ROWS][COLS], double row, double col) { for (int i = 0; i <= (int)row; i++) { for (int j = 0; j <= (int)col; j++) { printf("%c", arr[i][j]); } printf("\n"); } } //主函数 int main() { double N = 0; while(~scanf("%lf",&N)) { //创建底层计算数组 short cal[ROW][COL] = { 0 }; //创建输出数组 char show[ROWS][COLS] = { '0' }; //初始化底层计算数组,将数组元素全部设置为 1 Setcal(cal, ROW, COL); //初始化输出数组,将其全部元素设置为' ' Setshow(show, ROWS, COLS); //定位算法 Calculate(cal, pow(2, N - 1), COL); //根据计算结果更改输出数组元素 Change(show, cal, pow(2, N - 1), pow(2, N - 1) + 2, N); //打印输出数组 Display(show, 3 * pow(2, N - 1) - 1, 3 * pow(2, N) - 2); //打印树干 for (int i = 0; i < N; i++) { int j = (int)3 * pow(2, N - 1); printf("%*c\n", j,'*'); } } return 0; }