1

我想做一个这样的金字塔:-

____*
___*_*
__*___*
_*_____*
*********

对于 n = 5。线条不是下划线而是空格。

我的尝试:-

#include <iostream.h>
void main()
{ int i,k,l,n;
 cin>>n;
 for(i=1; i<=n-1; i++)
     {
      for(k=1; k<=i; k++)
          {if((k==n+i-1)||(k==n-i+1))
             cout<<"*";
           else
             cout<<" ";
          }
      cout<<"\n";
     }
 for(l=1; l<=2*n-1; l++)
     cout<<"*";
 }

但输出如下: -

__ *
 _*

注意:这是一个 turbo c++ 程序。

4

2 回答 2

1

将您的循环修改为此,它可以工作

 for(i=1; i<=n-1; i++)
 {
  for(k=1; k<i + n; k++) // greater range than previously to include whole triangle
      {if((k==n+i-1)||(k==n-i+1)) // == instead of --
         cout<<"*";
       else
         cout<<" ";
      }
  cout<<"\n";
 }
 for(l=1; l<=2*n-1; l++)
于 2013-09-28T09:54:35.470 回答
1

更新:

通过一些优化并以 n 作为行数而不是基本宽度,我们得到了一些非常简单的东西:

void drawPyramid(const int &n) {
    int b=2*n-1;
    for (int i=b/2; i>=0; i--) {
        for (int j=0;j<b-i; j++) {
            if (i==0 || j==i || j==b-i-1) {
                std::cout<<"*";
            } else {
                std::cout<<" ";
            }
        }
        std::cout<<std::endl;
    }
}

老的:

这样做很有趣,但它也很有效。我的方法是从金字塔末端可能具有的最大宽度开始计算,然后将问题分为两个不同的步骤:

  1. 转到第一个边缘
  2. 转到第二个边缘

它肯定可以优化,但它会给你的想法:

int drawPyramid(const int &baseWidth, const char &edgeChar, const char &outsideChar, const char &insideChar) {
    // test if base width allows to have a single char at the top of it
    if (baseWidth%2==0) {
        std::cout<<"Error in 'drawPyramid(const int &baseWidth)': Pyramid base width must be an odd number for the top to match"<<std::endl;
        return 0;
    }

    for (int i=baseWidth; i>=0; i-=2) { // the first edge is initially far, then gets closer
        int j=0;

        // Go to first edge
        while (j<i/2) {
            std::cout<<outsideChar;
            j++;
        }
        std::cout<<edgeChar;

        if (i==1) { // at the bottom of the pyramid
            for (int k=0; k<baseWidth-1; k++) {
                std::cout<<edgeChar;
            }
        } else if (i<baseWidth) { // test if there is a second edge to reach
            // Go to second edge
            while (j<baseWidth-i/2-2) {
                std::cout<<insideChar;
                j++;
            }
            std::cout<<edgeChar;
        }

        // Done with the current line
        std::cout<<std::endl;
    }

    return 1;
}

希望这可以帮助 :)

于 2013-09-28T11:27:53.977 回答