如何为以下星形图案增加空间?

时间:2018-11-21 13:45:05

标签: c++ loops for-loop

如何打印以下图案?

    *
   **
  ***
 ****
*****
****
***
**
*

如何在模式的前半部分添加空格? 我只设法使模式的后半部分正确:

#include <iostream>

using namespace std;

void printpattern(int n)
{
    for (int r = 0; r <= n; r++)
    {
        for (int z = 0; z <= r; z++) {
            cout << "*";
        }

        cout << endl;
    }
}

int main()
{
    int n = 5;
    printpattern(n);
}

3 个答案:

答案 0 :(得分:2)

如果害怕使用循环,那么这些东西当然总可以通过递归和一点数学来解决:

#include <iostream>

void pattern(int n, int p = 0)
{   
    if (!n) return;
    if (!p) { pattern(2 * n * n - n, n); return; }
    int k = --n / p, o = n % p + 1, t = o - (p - k);
    std::cout.put(" *"[k >= p && t < p || k < p && t >= 0]);
    --o || std::cout.put('\n');
    pattern(n, p);
}

答案 1 :(得分:1)

尽管有评论建议使用std::string,但我相信这是打算仅使用循环来编写的。这有效:

void printpattern(int n)
{
  // print first half.
  for (int i = 0; i < n; ++i) {
    // print spaces
    for (int r = n - i; r > 0; --r)
      std::cout << ' ';

    // print stars.
    for (int j = i; j > 0; --j) 
      std::cout << '*';

    std::cout << '\n';
  }

  /// print second half. No need to print spaces here.
  for (int i = 1; i <= n; ++i) {
    for (int r = n - i; r >= 0; --r) 
      std::cout << '*';

    std::cout << '\n';
  }
}

答案 2 :(得分:1)

通过编写更长的字符串并使用滑动视图更容易做到这一点。

在C ++中,这非常简单:

#include <iostream>
#include <string>
#include <string_view>

void printpattern(std::size_t n)
{
    const auto s = std::string(n, ' ') + std::string(n, '*') + std::string(n, ' ');
    for (std::size_t i = 1;  i < n*2;  ++i)
        std::cout << std::string_view(s.data()+i, n) << '\n';
}

int main()
{
    printpattern(5);
}

您当然可以使空格填充的长度都为n-1,并使用更常规的循环,使i从零开始:

    const auto s = std::string(n - 1, ' ') + std::string(n, '*')
                 + std::string(n-1, ' ');
    for (std::size_t i = 0;  i < n * 2 - 1;  ++i)

由您自己决定是否值得保存两个字符的临时字符串。