前几天参加了一个比赛,题目:输出边长为n的正六边形,边长用" * "表示,,,写的好复杂啊,,,求简单算法。。。
算法:先输出上半部分,然后输出下办部分,两者分开,中间用循环,先打印空格,然后打印*,然后在打印中间的空心空格,最后打印*。
代码如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 int i, j, x, y; //各个层的循环变量 6 7 int nBorder = 0; //初始化边长 8 int nSpace; //中间空格数 9 10 //正确赋值边长 11 printf("请输入正六边形边长(n >= 2): "); 12 scanf("%d", &nBorder); 13 while (nBorder <2) 14 { 15 printf("非法输入,请重新输入。"); 16 scanf("%d", &nBorder); 17 } 18 19 nSpace = nBorder - 2; //初始化中间空格数 20 21 //先输出正六边形上半部分 ( n行 ) 22 for (i = 0; i < nBorder; i++) //外循环控制行输出 23 { 24 for (j = 0; j < nBorder - 1 - i; j++) //内循环控制列输出 25 { 26 printf(" "); //打印空格 27 } 28 29 if (0 == i) //第一行 30 { 31 for (x = 0; x < nBorder;x++) 32 { 33 printf("*"); 34 } 35 } 36 else 37 { 38 printf("*"); 39 40 nSpace = nSpace + 2; 41 for (y = 0; y < nSpace; y++) 42 { 43 printf(" "); //打印中间的空心空格 44 } 45 46 printf("*"); //打印一行最后一个* 47 } 48 49 printf("\n"); //换行 50 } 51 52 //然后输出下半部分 ( n - 1 行 ) 53 nSpace = nBorder + (nBorder - 2) * 2; //重新初始化中间空格数 54 55 for (i = 1; i <= nBorder - 1; i++) 56 { 57 for (j = 0; j < i; j++) 58 { 59 printf(" "); //打印起始空格数 60 } 61 62 if ((nBorder - 1) == i) //最后一行 63 { 64 for (x = 0; x < nBorder; x++) 65 { 66 printf("*"); 67 } 68 } 69 else 70 { 71 printf("*"); 72 73 nSpace = nSpace - 2; 74 for (y = 0; y < nSpace; y++) 75 { 76 printf(" "); //打印中间的空心空格 77 } 78 79 printf("*"); //打印一行最后一个* 80 } 81 82 printf("\n"); //换行 83 } 84 85 return 0; 86 }