简体   繁体   English

用C ++中心Pascal的三角形输出

[英]Centering Pascal's Triangle Output in C++

I have successfully written a code to output Pascal's Triangle in a somewhat triangular shape using cout.width(total_rows - current_row), but it looks like this: 我已成功编写了一个代码,使用cout.width(total_rows - current_row)以稍微三角形的形状输出Pascal的三角形,但它看起来像这样:

               1 
              1 1 
             1 2 1 
            1 3 3 1 
           1 4 6 4 1 
          1 5 10 10 5 1 
         1 6 15 20 15 6 1 
        1 7 21 35 35 21 7 1 
       1 8 28 56 70 56 28 8 1 
      1 9 36 84 126 126 84 36 9 1 
     1 10 45 120 210 252 210 120 45 10 1 
    1 11 55 165 330 462 462 330 165 55 11 1 
   1 12 66 220 495 792 924 792 495 220 66 12 1 
  1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 
 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1 
1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1

I would like it to be completely centered. 我希望它完全集中。 I figured out that I can take the number or characters in the bottom row, subtract the number of characters in the current row, and divide this by two to get the desired number of spaces per row [which would look like: cout.width((bottow_row_characters - current_row_characters) / 2) ], but I'm having trouble actually implementing this idea. 我发现我可以取底行中的数字或字符,减去当前行中的字符数,然后将其除以2,得到每行所需的空格数[看起来像:cout.width( (bottow_row_characters - current_row_characters)/ 2)],但我实际上没有实现这个想法。

I've tried computing just the bottom row and storing in it a string or array and then using string.length() or sizeof(array), but neither has worked. 我已经尝试计算底行并在其中存储一个字符串或数组,然后使用string.length()或sizeof(数组),但两者都没有效果。 (sizeof always returns 4, which is incorrect) (sizeof总是返回4,这是不正确的)

Here is the code: 这是代码:

#include <iostream>
#include <string>
using namespace std;


// Forward declaration of a function.
int Pascal (int row, int column);




 /* The main function.
  *
  * Parameters:
  *    none
  *
  * Return value:
  *    0 if we complete successfully, 1 if there was an error.
  */

 int main ()
 {

  // introduction

  cout << "\nPascal's Triangle!\n";
  cout << "(Pascal's triangle is made by taking the sum of two numbers\n";
  cout << "and placing that number directly underneath the two numbers.\n";
  cout << "This creates a triangular array of binomial coefficients)\n\n";


  // for loops to calculate and print out pascal's triangle

     for (int row = 0; row <= 15; row++)
    {

      cout.width(16 - row);

      for (int column = 0; column <= row; column++)
        {
          cout << Pascal(row, column) << " ";
        }

      cout << endl;
    }

    cout << endl;
}




/* This function calculates Pascal's triangle based on row and column position.
 *
 * Parameters:
 *    row, column
 *
 * Return value:
 *    the numbers in Pascal's triangle
 */

int Pascal (int row, int column)
{

  // if statements to calculate pascal's triangle through recursion

  if (column == 0)
    return 1;

  else if (row == column)
    return 1;

  else
    return Pascal(row - 1, column - 1) + Pascal(row - 1, column);
}

I figured it out. 我想到了。 You have to use the stringstream library to convert the integer line from the Pascal function to a string. 您必须使用stringstream库将Pascal函数中的整数行转换为字符串。 You can then just use string.length() to figure out how many characters are in the string. 然后,您可以使用string.length()来确定字符串中有多少个字符。 Then you do the math that I was explaining earlier to adjust the output. 然后你做我之前解释的数学来调整输出。

Here's my code: 这是我的代码:

/*
 * Pascal's Triangle: Prints the first 15 rows of Pascal's triangle.
 *
 */


#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;


// Forward declaration of a function.
int Pascal (int row, int column);
int rowLength (int row, int column);



/* The main function.
 *
 * Parameters:
 *    none
 *
 * Return value:
 *    0 if we complete successfully, 1 if there was an error.
 */

int main ()
{

  // introduction

  cout << "\nPascal's Triangle!\n";
  cout << "(Pascal's triangle is made by taking the sum of two numbers\n";
  cout << "and placing that number directly underneath the two numbers.\n";
  cout << "This creates a triangular array of binomial coefficients)\n\n";


  // determination of how long the bottom row is

  int bottom_row;
  string bottom_row_characters;
  stringstream out;

   for (int row = 15; row <= 15; row++)
    {

      for (int column = 0; column <= row; column++)
        {
          out << " " << Pascal(row, column) << " ";
        }
      bottom_row_characters += out.str();
    }


  // for loops to calculate and print out pascal's triangle

   for (int row = 0; row <= 15; row++)
    {
      cout.width((bottom_row_characters.length() - rowLength(row, 0)) / 2);

      for (int column = 0; column <= row; column++)
        {
          cout << " " << Pascal(row, column) << " ";
        }

      cout << endl;
    }

    cout << endl;
}


/* This function calculates Pascal's triangle based on row and column position.
 *
 * Parameters:
 *    row, column
 *
 * Return value:
 *    the numbers in Pascal's triangle
 */

int Pascal (int row, int column)
{

  // if statements to calculate pascal's triangle through recursion

  if (column == 0)
    return 1;

  else if (row == column)
    return 1;

  else
    return Pascal(row - 1, column - 1) + Pascal(row - 1, column);
}





/* This function converts a row from Pascal's Triangle from integers to a string
 *
 * Parameters:
 *    row, column
 *
 * Return value:
 *    a string representing a row in Pascal's triangle
 */

int rowLength (int row, int column)
{

  int current_row;
  string current_row_characters;
  stringstream out;

  for (int current_row = row; current_row <= row; current_row++)
    {
     for (int column = 0; column <= row; column++)
       {
         out << " " << Pascal(row, column) << " ";
       }
     current_row_characters += out.str();
    }

  return current_row_characters.length();
}

使用std::setw使所有输出恒定宽度:

cout << setw(5);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM