首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用c++实现星形菱形

问用c++实现星形菱形
EN

Stack Overflow用户
提问于 2012-01-11 16:37:40
回答 4查看 7.2K关注 0票数 1

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

代码语言:javascript
复制
  *
 * *
* * * = n
 * * 
  *

我试着用两个循环来做,但没有成功,而且程序太复杂了,无法理解,所以我没有把它包含在这里。

那么你能想到什么算法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-11 16:46:10

我相信这是一个常见的教育问题,因此在谷歌上搜索会很有帮助。

这里有一个现成的Visual C++解决方案(因为有些人从代码示例中学到了更好的东西,所以选择是你的)……

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

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

代码语言:javascript
复制
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个循环

代码语言:javascript
复制
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";
票数 1
EN

Stack Overflow用户

发布于 2012-01-11 16:48:28

那不是金字塔,那是菱形:)

不管怎样,让我们看看星号:

  • 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大小的菱形:

  • there 2*n-1
  • 每行is w = 2*n-1 characters wide
  • 每行(从i=0开始)都有m = min(i+1, 2*n-1-i)星号,并且它们之间有m-1空格
  • ,因此每一行都需要在两侧填充w - (m) - (m-1)空格,即:w/2。

现在去写吧!:)

票数 13
EN

Stack Overflow用户

发布于 2012-01-12 19:45:44

两个循环?当然你只需要一个就行了..以下是我想出的算法的粗略描述:

  • 循环通过(2*n-1)^2正方形
  • 确定当前行所需的星数(即与具有n的行的距离

与当前索引中间的距离

  • 如果当前索引的绝对距离小于该行上的星数,则需要奇数/偶数索引的星数,具体取决于n是否为奇数/偶数。
  • Add endlines of row

这是一个近乎IOCC-worthy的即兴算法,它画出了菱形,其中有两个变量,循环计数器和中间行的恒星的n=amount。

代码语言:javascript
复制
#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",我想这可能不是必需的。正如您所看到的,有时几个额外的描述性变量会有很大的帮助。如果这是家庭作业,你最好准备好解释它..

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8816348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档