使用c+的菱形星+; 如何用最少的循环数和变量,在C++中输出菱形形状的星号。最大星星数=n(从用户处获取的输入)

使用c+的菱形星+; 如何用最少的循环数和变量,在C++中输出菱形形状的星号。最大星星数=n(从用户处获取的输入),c++,C++,我试着只用了两个循环,但没有成功,加上程序太复杂,无法理解,所以没有在这里包括它 你能想到什么算法 我认为这是教育界的一个常见问题,因此谷歌搜索非常有用 这里是VisualC++中现成的解决方案(因为有些人从代码示例中学习得更好,选择是你的)…< / P> 编辑:试图减少for循环并保持星星之间的间距,这是我最大的努力 int i, j; int n = 0; std::cout << "Enter the maximum number of *:"; std::cin >&

我试着只用了两个循环,但没有成功,加上程序太复杂,无法理解,所以没有在这里包括它


你能想到什么算法

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

这里是VisualC++中现成的解决方案(因为有些人从代码示例中学习得更好,选择是你的)…< / P>

编辑:试图减少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";
inti,j;
int n=0;
std::cout>n;

我相信这是教育界的一个常见问题,因此谷歌搜索非常有用

这里是VisualC++中现成的解决方案(因为有些人从代码示例中学习得更好,选择是你的)…< / P>

编辑:试图减少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";
inti,j;
int n=0;
std::cout>n;

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

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

  • 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行(从i=0开始)中的每一行都有
    m=min(i+1,2*n-1-i)
    星星,它们之间有
    m-1
    空格
  • 因此,每行需要
    w-(m)-(m-1)
    两侧的空格填充,即左右两侧的
    w/2

现在去写吧!:)

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

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

  • 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行(从i=0开始)中的每一行都有
    m=min(i+1,2*n-1-i)
    星星,它们之间有
    m-1
    空格
  • 因此,每行需要
    w-(m)-(m-1)
    两侧的空格填充,即左右两侧的
    w/2
现在去写吧!:)

分解任务

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

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

所有的编程都是这样的,你面对一个复杂的问题,你把它分解成更小的子问题。

分解任务

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

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


所有的编程都是这样的,你面对一个复杂的问题,你把它分解成更小的子问题。

两个循环?你当然只需要一个就可以过得去。。下面是对我提出的算法的粗略描述:

  • 在(2*n-1)^2正方形中循环
  • 确定当前行上需要的星号数量(即到有n个星号的行的距离)
  • 确定距当前索引中间的距离
  • 如果当前索引的绝对距离小于该行上的星数,则需要奇偶索引中的星,具体取决于n是否为奇偶
  • 在行的末尾添加端点
这是一个近乎有价值的快速算法,它用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)
{

对于(inti=1;i两个循环?当然你只需要一个就可以了。下面是我提出的算法的大致描述:

  • 在(2*n-1)^2正方形中循环
  • 确定当前行上需要的星号数量(即到有n个星号的行的距离)
  • 确定距当前索引中间的距离
  • 如果当前索引的绝对距离小于该行上的星数,则需要奇偶索引中的星,具体取决于n是否为奇偶
  • 在行的末尾添加端点
这是一个近乎有价值的快速算法,它用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)
{

对于(int i=1;i作业???如果是,请相应地标记:)我们需要遵循特定的顺序吗?这是一个有趣的作业。@Sanjay不,这不是作业:D我只是想用尽可能少的循环和变量来完成这项工作。@CppLearner没有细节…我只是想为“n”输入w显示一个菱形