如何使用3 for循环而不是4来打印以下模式?

时间:2016-08-14 14:34:15

标签: c++

我正在尝试打印以下模式:

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

现在,我知道如何使用4 for循环:

for(i=1;i<=n;i++)
{
    for(j=1;j<=i;j++)
    {
        cout<<"*";
    }
    cout<<"\n";
}

打印上半部分并打印下半部分:

for(i=1;i<=n;i++)
 {
    for(j=n;j>i;j--)
    {
        cout<<"*";
    }
     cout<<"\n";
}

仔细观察,两个外部for循环是相同的。即, 对于(I = 1; I&LT; = N;我++)。 无论如何在i-for循环中嵌套'j'for-loops?

8 个答案:

答案 0 :(得分:3)

只使用一个循环:

#include <iostream>
#include <string>

int main() {
   for (unsigned i = 0; i < 10; ++i)
      std::cout << std::string( i < 5 ? (i+1) : 10 - (i+1), '*') << std::endl;

   return 0;
}

答案 1 :(得分:1)

你是否会关心甚至不是三个循环,而只是两个循环?

int n=5, i, j, k;

for (i=0; i<n*2-1; i++)
{
   j=i;
   if (j >= n)
      j=n*2-2-j;

   for (k=0; k<=j; k++)
      std::cout << '*';
   std::cout << std::endl;
}

答案 2 :(得分:1)

使用2个循环:

int g=1;
for(int i=0;i<=5;i++){
for (int y=0;y<=i;y+=g){
cout<<"*";
}

cout<<endl;

if (i==4 && g==1){
cout<<"*****";
i=3;
g=-1;
}}

答案 3 :(得分:1)

您可以打印10,而不是打印5行,然后再打印5行,并计算每行中的星数。

for(i = 1; i <= 2*n - 1; i++)
{
    for(j = 1; j <= n - abs(i - n); j++)
        {
            cout<<"*";
        }
    cout<<"\n";
}

对于i在1和n之间的值,表达式n-abs(i-n)计算为i,对于i大于n的值,表达式 public static void SendImage() { WebClient client = new WebClient(); Screenshot screen = new Screenshot(); byte[] SendBMP = screen.Capture(); client.Headers["User-Agent"] = "IMAGE uploader"; client.Headers[HttpRequestHeader.ContentType] = "binary/octet-stream"; client.QueryString.Add("UserID", ID); client.UploadData(new Uri("http://mywebsite.com/upload.php/"), SendBMP); } 计算为2n-i。

答案 4 :(得分:1)

只是为了好玩,一个循环怎么样:

  for (int i=1, j=0, dir=1; i!=0;) {
      cout << '*';
      ++j;

      if (j==i) {
          cout << '\n';
          j = 0;
          i += dir;

          if (i==6) {
              dir = -1;
              i -= 2;
          }
      }      
  }

答案 5 :(得分:1)

你可以在一个循环中完成(也许作弊一点):

size_t max = 5;
size_t rows = max * 2 - 1;
std::string line(std::string(max, '*') + '\n');

for ( size_t j = 0, k = max; j < rows; ++j ) {
    std::cout << line.c_str() + ( j < max ? --k : ++k );
}

答案 6 :(得分:1)

我知道你没有要求它,但为了完整性,这里有一个零循环(相反递归):

#include <iostream>

void print_stars(int count)
{
    if (count > 0)
    {
        std::cout << '*';
        print_stars(count - 1);
    }
}

void print_line(int lines, int stars)
{
    if (lines == 1)
        print_stars(stars);
    else
    {
        if (stars > 0)
        {
            print_stars(stars);
            std::cout << std::endl;
        }

        print_line(lines - 1, stars + 1);
        std::cout << std::endl;

        if (stars > 0)
            print_stars(stars);
    }
}

int main()
{
    int star_count = 5;
    print_line(star_count + 1, 0);
    return 0;
}

答案 7 :(得分:1)

#include <iostream>
using namespace std;
int main() {
    int i;
    int j;
    int count = 1;
    for(i= 0;i<10;i++) {
        if(i < 5) {
           for(j=0;j<=i;j++) {
               cout<<"*";
           }
        } else {
           for(j=i-count;j>0;j--) {
              cout<<"*";
           } 
           count +=2;
    }
       cout<< "\n";
   }
   return 0;
}