首页 > 解决方案 > 如何在不使用条件语句的情况下打印横向金字塔?

问题描述

我必须打印出一个横向金字塔:

O

OO

OOO

OOOO

OOO

OO

O

我已经设法使用两个 for 循环和一个 if 语句来做到这一点,但我想知道是否可以使用两个 for 循环和没有条件语句来做到这一点。

char character = 79;
int temp = 1;

for (int i = 0; i < 7; i++)
{
    std::cout << character;
    
    if (i >= 4) 
    {
        temp = temp + 2;
    }

    for (int j = 0 + temp; j <= i; j++)
    {
        std::cout << character;
    }

    std::endl(std::cout);
}

标签: c++

解决方案


可以使用两个(或 1 个,带有辅助函数)嵌套的循环。哦,还有一些数学。

考虑到我们可以很容易地编写一个函数来打印一行。

void print_row(char ch, int len) {
    for (int i = 0; i < len; i++) {
        std::cout << ch;
    }

    std::cout << std::endl;
}

如果我们调用它,我们只需要 1 个循环。如果我们循环到某个大小,我们确实需要将大小乘以 2 减去 1。每次生成什么数字?

const int size = 4;

for (int i = 1; i <= size * 2 - 1; i++) {
    ...
}
1
2
3
4
5
6
7

但是,我们真正需要的是这些数字,以提供给print_row

1
2
3
4
3
2
1

直到我们到达5,一切都很好。对于 5 及以上,我们需要回到较低的数字。我们可以使用三元运算符和一些数学来实现。

const int size = 4;

for (int i = 1; i <= size * 2 - 1; i++) {
    int len_of_row = (i <= size ? i : size - (i - size));
    print_row('0', len_of_row);
}

让我们把它分开。i - size什么时候i是 5 和什么时候size是 4 会给我们1。如果我们从我们的 中减去它size,我们得到3。如果我们对存在做同样的i事情6,我们就会得到2,如果我们这样做,7我们就会得到1

现在,也许三元是作弊,因为它是条件的替代品。

我们可以利用运算符优先级和布尔逻辑短路的方式来消除三元表达式。我们确实必须重写print_rowturn returnbool并且总是 return true

const int size = 4;

for (int i = 1; i <= size * 2 - 1; i++) {
    i <= size && print_row('0', i) || print_row('0', size - (i - size);
}

推荐阅读