菱形(代码后面有蠢思路)
题目描述
输入一个奇数n,输出一个由‘’构成的n阶实心菱形。
输入格式:一个奇数n。
输出格式:输出一个由‘’构成的n阶实心菱形。
具体格式参照输出样例。
数据范围
1≤n≤99
输入样例
5
输出样例
*
***
*****
***
*
#include <iostream>
#include <cstdlib>
using namespace std;
void print() {
int n = 0;
do {
cout << "请输入一个大于零的奇数:";
cin >> n;
} while(n % 2 == 0 || n <= 0);
int a = n / 2 + 1;
int b = n / 2;
for(int i = 0; i < a; i++) {
for(int j = 0; j < b - i; j++) {
cout << " ";
}
for(int j = 0; j < 2 * i + 1; j++) {
cout << "*";
}
cout << endl;
}
for(int i = 0; i < b; i++) {
for(int j = 0; j < i + 1; j++) {
cout << " ";
}
for(int j = 0; j < n - 2 * i - 2; j++) {
cout << "*";
}
cout << endl;
}
}
int main( ) {
print();
system("pause");
return 0;
}
拼凑思路如下:
打印如下图形:
*
***
*****
*******
*****
***
*
分析:i 表示行号, j 表示列号。图形要分上下两部分的三角形输出
先输出上半部分的四行字符组成的三角形。然后输出下面的三行字符组成的三角形。于是,
for(int i = 0; i < 4; i++) {
// 输出空格
// 输出星号
cout << endl;
}
for(int i = 0; i < 3; i++) {
// 输出空格
// 输出星号
cout << endl;
}
解决上半部分的空格输出
i = 0 时,j = 0, 1, 2 < 3 => i + j < 3
i = 1 时,j = 0, 1 < 2 => i + j < 3
i = 2 时,j = 0 < 1 => i + j < 3
于是,for(int j = 0; j < 3 - i; j++) printf(" ");
解决上半部分的星号输出
i = 0 时,j = 3 输出一个星号
i = 1 时,j = 2, 3, 4 输出三个星号
i = 2 时,j = 1, 2, 3, 4, 5 输出五个星号
i = 3 时,j = 0, 1, 2, 3, 4, 5, 6 输出七个星号
简化:显然星号的输出与具体的j的数值无关,只与循环的轮数有关
i = 0 时,j ∈ [[0, 1) 得出规律:j = 2 * i + 1;
i = 1 时,j ∈ [[0, 3)
i = 2 时,j ∈ [[0, 5)
i = 3 时,j ∈ [[0, 7)
于是,
for(int j = 0; j < 2 * i + 1; j++) printf("*");
上半部分的三角形的输出代码已经得到:
int n = 7;
int a = n / 2 + 1;
int b = n / 2;
for(int i = 0; i < a; i++) {
for(int j = 0; j < b - i; j++) {
cout << " ";
}
for(int j = 0; j < 2 * i + 1; j++) {
cout << "*";
}
cout << endl;
}
下半部分的三角形输出:
空格组成的三角形
i = 0 时,j = 0 < 1
i = 1 时,j = 0, 1 < 2
i = 2 时,j = 0, 1, 2 < 3
于是,for(int j = a; j < i + 1; j++) printf(" ");
星形组成的三角形
i = 0 时,j = 1, 2, 3, 4, 5 输出5个星号
i = 1 时,j = 2, 3, 4 输出3个星号
i = 2 时,j = 3 输出1个星号
输出星号的个数与 j 的具体数值无关。只要保证循环的次数即可。所以转化为:
i = 0 时,j ∈ [0, 5) 观察得到:5 = 5 - 2 * 0 得出规律:j < 5 - 2 * i
i = 1 时,j ∈ [0, 3) 3 = 5 - 2 * 1
i = 2 时,j ∈ [0, 1) 1 = 5 - 2 * 2
于是,for(int j = 0; j < 5 - 2 * i; j++) printf("*");
for(int i = 0; i < 3; i++) {
for(int j = a; j < i + 1; j++) {
printf(" ");
}
for(int j = 0; j < 5 - 2 * i; j++) {
printf("*");
}
cout << endl;
}
综上所述:
void print(int n) {
int a = n / 2 + 1;
int b = n / 2;
for(int i = 0; i < a; i++) {
for(int j = 0; j < b - i; j++) {
cout << " ";
}
for(int j = 0; j < 2 * i + 1; j++) {
cout << "*";
}
cout << endl;
}
for(int i = 0; i < b; i++) {
for(int j = 0; j < i + 1; j++) {
printf(" ");
}
for(int j = 0; j < n - 2 * i - 2; j++) {
printf("*");
}
cout << endl;
}
}