有上题基础,本题更改循环内容即可。看了看题解没有把上下层金字塔放在一个循环里输出的所以来写一篇。
金字塔上半和下半输出是关于第n行对称的。
计算空格:对n-i取绝对值即可。
计算星号:认为每行有2n-1个字符,星号前后各有abs(n-i)个空格,使用每行总字符数2n-1减去每行总空格数2*abs(n-i)得出。
代码如下:

#include <iostream>
using namespace std;
int n;

int main() {
    while(scanf("%d", &n) != EOF) {
        for(int i = 1; i <= 2*n-1; i++) {
            for(int j = abs(n-i); j > 0; j--) {
                printf(" ");
            }
            for(int k = 1; k <= 2*n-1 - 2*abs(n-i); k++) {
                printf("*");
            }
            for(int j = abs(n-i); j > 0; j--) { // 后半部分空格可以不输出
                printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}