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:
- Write a program to generate and display here the first n lines of a Floyd triangle.
(Use n=5 and n=14 rows). - 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
Content is available under GNU Free Documentation License 1.2.