使用c ++的星形菱形

时间:2012-01-11 08:37:40

标签: c++

如何使用最少数量的循环和变量在c ++中以菱形形状输出以下星号。最大数量of stars = n(来自用户的输入)

  *
 * *
* * * = n
 * * 
  *

我尝试用2个循环来做但没有成功加上程序太复杂而无法理解所以没有在这里包含它。

那么你能想到的算法是什么?

4 个答案:

答案 0 :(得分:13)

那不是金字塔,这是一个菱形:)

无论如何,让我们看看星号:

  • n = 1 - > 1星级
  • n = 2 - > 4星
  • n = 3 - > 9星

模式看起来是从1到n减去n的总和的两倍(因为中间行只存在一次而不是两次),所以s(n) = 2 * (1+n)/2 * n - n = (1+n)*n-n = n*n嘿它是正方形的区域!那多么令人惊讶。 : - )

现在如何画出一个n尺寸的菱形:

  • 会有2*n-1
  • 每行w = 2*n-1个字符宽
  • 每一行(从i = 0开始)有m = min(i+1, 2*n-1-i)个星星,它们之间有m-1个空格
  • 所以每一行都需要w - (m) - (m-1)个空间填充空间,即左侧和右侧w/2

现在去写吧! :)

答案 1 :(得分:1)

这是我认为的教育常见问题,因此谷歌搜索非常有用。

以下是Visual C ++中现成的解决方案(因为有些人从代码示例中学到更多,选择权归你所有)......

http://www.softwareandfinance.com/Visual_CPP/Loops_Diamond_Pattern.html

编辑:尝试减少for循环并保持星间距,这是我的最大努力......

int i, j;
int n = 0;
std::cout << "Enter the maximum number of *:";
std::cin >> n;

std::cout << "\n\n";

for (i = 1; i <= n; i++)
{
      std::cout.width(n - i);
      std::cout.fill(' ');
      std::cout << "";

      for (j = 1; j <= i; j++)
            std::cout << "* ";

      std::cout.width(n - i);
      std::cout.fill(' ');
      std::cout << "";

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

for (i = n - 1; i >= 1; i--)
{
      std::cout.width(n - i);
      std::cout.fill(' ');
      std::cout << "";

      for (j = 1; j <= i; j++)
            std::cout << "* ";

      std::cout.width(n - i);
      std::cout.fill(' ');
      std::cout << "";

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

std::cout << "\n";

仅使用2个

int i, j;
int n = 0, c = 0, inc = 1;
std::cout << "Enter the maximum number of *:";
std::cin >> n;

std::cout <<"\n\n";

for (i = 1; i <= (n * 2) - 1; i++)
{
    c += inc;
    if(i == n)
        inc = -1;

    std::cout.width(n - c);
    std::cout.fill(' ');
    std::cout << "";

    for (j = 1; j <= c; j++)
        std::cout << "* ";

    std::cout.width(n - c);
    std::cout.fill(' ');
    std::cout << "";

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

std::cout <<"\n";

答案 2 :(得分:1)

两个循环?当然,你可以只使用一个......这里是我想出的alogirthm的粗略描述:

  • 循环通过(2 * n-1)^ 2平方
  • 确定当前行所需的星星数量(即与n星的行距离)
  • 确定距当前索引中间的距离
  • 如果当前指数的绝对距离小于该行上的星数,则需要奇数/偶数指数中的星形,具体取决于n是奇数还是偶数。
  • 添加行尾行

这是一个近IOCC - 值得快速即兴的算法,用2个变量绘制菱形,循环计数器和n =中间行的星数。

#include <cmath>
void print_rhombus(int n) 
{
    for (int i = 1; i <= ((2*n-1)*(2*n-1)); ++i) {        
        if ((abs((((2*n-1)+1)/2)-(i%(2*n-1) == 0?2*n-1:i%(2*n-1)))) - (n-abs((i%(2*n-1)==0?(i/(2*n-1)):(i/(2*n-1))+1) - n)) < 0 && (
                (n%2==1 && ((n-abs((i%(2*n-1)==0?(i/(2*n-1)):(i/(2*n-1))+1) - n))%2==1 && (i%(2*n-1) == 0?2*n-1:i%(2*n-1))%2 == 1 || (n-abs((i%(2*n-1)==0?(i/(2*n-1)):(i/(2*n-1))+1) - n))%2==0 && (i%(2*n-1) == 0?2*n-1:i%(2*n-1))%2==0)) || 
                (n%2==0 && ((n-abs((i%(2*n-1)==0?(i/(2*n-1)):(i/(2*n-1))+1) - n))%2==1 && (i%(2*n-1) == 0?2*n-1:i%(2*n-1))%2 == 0 || (n-abs((i%(2*n-1)==0?(i/(2*n-1)):(i/(2*n-1))+1) - n))%2==0 && (i%(2*n-1) == 0?2*n-1:i%(2*n-1))%2==1))
                )) {
            std::cout << "*"; 
        } else { 
            std::cout << " "; 
        } 
        if (i%(2*n-1) == 0 && (n-abs((i%(2*n-1)==0?(i/(2*n-1)):(i/(2*n-1))+1) - n)) == n) {
            std::cout << " = " << n << std::endl; 
        }
        else if (i%(2*n-1) == 0) { 
            std::cout << std::endl; 
        }
    }    
}

它还打印“= N”,我想这可能不是必需的。正如您所看到的,有时候一些额外的描述性变量会有很长的路要走。如果这是家庭作业,你最好准备解释它..

答案 3 :(得分:0)

打破任务。

1)首先编写一个输出方形星号的程序。在上面的例子中(我认为n = 3),五乘五的方格将包含您想要输出的所有星号。两个循环(一个在另一个内)是实现此目的的方法。

2)现在你得到了你需要的所有星号,找出应该跳过星号的公式,以获得你想要的菱形图案。如果您决定跳过星号,则输出一个空格。

所有编程都是这样的,你面临着一个复杂的问题,你将其分解为更小的子问题。