如何打印以下图案?
*
**
***
****
*****
****
***
**
*
如何在模式的前半部分添加空格? 我只设法使模式的后半部分正确:
#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);
}
答案 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)
由您自己决定是否值得保存两个字符的临时字符串。