Интервал в программе треугольника Паскаля Stack Overflow

Мне нужна помощь с программой, которая печатает треугольник Паскаля на С ++. Мне нужно расстояние, чтобы выглядеть так:

How many rows: 4
1
1     1
1     2     1
1     3     3     1
1     4     6     4     1

но вместо этого это выглядит так:

Enter a number of rows: 4
1
1           1
1           2            1
1           3            3            1
1           4            6            4            1

Мой код:

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

int combinations (int n, int k) {
if (k == 0 || k == n) {
return 1;
}
else {
return combinations(n-1,k-1) + combinations(n-1,k);
}
}

int main ( ) {
int rows;
cout << "Enter a number of rows: ";
cin >> rows;
for(int r = 0; r < rows+1; r++) {
cout << "            " << "1";
for(int c = 1; c < r+1; c++) {

cout << "           " << combinations(r, c) << ' ';

}
cout << endl;
}
}

Может ли кто-нибудь помочь мне получить правильный интервал?

0

Решение

Похоже, главное отличие — это расстояние спереди, которое у вас постоянно, но не должно быть:

cout << "            " << "1";

Вместо этого, если вы посчитаете количество пробелов в начале в желаемом выводе, вы заметите, что оно уменьшается на 3 в каждой строке. Так:

for (int s = 0; s < 3 * (rows - r) + 1; ++s) {
cout << ' ';
}
cout << '1';

Или просто:

cout << std::string(3 * (rows - r) + 1, ' ');

Также печать каждого элемента неверна. Вместо:

cout << "           " << combinations(r, c) << ' ';

Вы хотите это: (пять пробелов в начале, без пробелов в конце):

cout << "     " << combinations(r, c);

Или, для ясности:

cout << std::string(5, ' ') << combinations(r, c);

Однако ни один из них не будет обрабатывать многозначные значения, поэтому на самом деле правильнее всего использовать setw:

cout << setw(3 * (rows - r) + 1) << '1';
// ..
cout << setw(6) << combinations(r, c);
1

Другие решения


По вопросам рекламы [email protected]