C++: Floyd’s Triangle

Bjarne-stroustrup
 

Floyd’s triangle lists the natural numbers in a right triangle aligned to the left where

  • the first row is just 1
  • successive rows start towards the left with the next number followed by successive naturals listing one more number than the line above.

The first few lines of a Floyd triangle looks like this:

 1
 2  3
 4  5  6
 7  8  9 10
11 12 13 14 15

The task is to:

  1. Write a program to generate and display here the first n lines of a Floyd triangle.
    (Use n=5 and n=14 rows).
  2. Ensure that when displayed in a monospace font, the numbers line up in vertical columns as shown and that only one space separates numbers of the last row.
#include <windows.h>
#include <sstream>
#include <iostream>

//--------------------------------------------------------------------------------------------------
using namespace std;

//--------------------------------------------------------------------------------------------------
class floyds_tri
{
public:
	floyds_tri()  { lastLineLen = 0; }
	~floyds_tri() { killArray(); }

	void create( int rows )
	{
		_rows = rows;
		calculateLastLineLen();
		display();
	}

private:
	void killArray()
	{
		if( lastLineLen ) 
		delete [] lastLineLen;
	}

	void calculateLastLineLen()
	{
		killArray();
		lastLineLen = new BYTE[_rows];

		int s = 1 + ( _rows * ( _rows - 1 ) ) / 2;

		for( int x = s, ix = 0; x < s + _rows; x++, ix++ )
		{
			ostringstream cvr;
			cvr << x;
			lastLineLen[ix] = static_cast<BYTE>( cvr.str().size() );
		}
	}

	void display()
	{
		cout << endl << "Floyd\'s Triangle - " << _rows << " rows" << endl << "===============================================" << endl;
		int number = 1;
		for( int r = 0; r < _rows; r++ )
		{
			for( int c = 0; c <= r; c++ )
			{
				ostringstream cvr;
				cvr << number++;
				string str = cvr.str();
				while( str.length() < lastLineLen[c] )
				str = " " + str;
				cout << str << " ";
			}
			cout << endl;
		}
	}

	int _rows;
	BYTE* lastLineLen;
};
//--------------------------------------------------------------------------------------------------
int main( int argc, char* argv[] )
{
	floyds_tri t;
	int s;
	while( true )
	{
		cout << "Enter the size of the triangle ( 0 to QUIT ): "; cin >> s;
		if( !s ) return 0;
		if( s > 0 ) t.create( s );

		cout << endl << endl;
		system( "pause" );
	}

	return 0;
}
//--------------------------------------------------------------------------------------------------

Output:

Floyd's Triangle - 5 rows
===============================================
 1
 2  3
 4  5  6
 7  8  9 10
11 12 13 14 15


Floyd's Triangle - 14 rows
===============================================
 1
 2  3
 4  5  6
 7  8  9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44  45
46 47 48 49 50 51 52 53  54  55
56 57 58 59 60 61 62 63  64  65  66
67 68 69 70 71 72 73 74  75  76  77  78
79 80 81 82 83 84 85 86  87  88  89  90  91
92 93 94 95 96 97 98 99 100 101 102 103 104 105

SOURCE

Content is available under GNU Free Documentation License 1.2.