Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
VLena
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 199
1

Получить и напечатать первые n строк треугольника Паскаля

17.10.2015, 21:06. Просмотров 1220. Ответов 9
Метки нет (Все метки)

Дано натуральное число n. Получить и напечатать первые n строк треугольника Паскаля.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2015, 21:06
Ответы с готовыми решениями:

Получить квадратную матрицу, содержащую первые 10 строк треугольника Паскаля
Помогите, пожалуйста решить задачу: Сформировать двумерный массив размером 10...

Подсчитать первые десять строчек треугольника Паскаля
Пожалуста, кто сможет, решите задачку: Написать программу, которая подсчитывает...

Построить n строк треугольника Паскаля
Построить n строк треугольника Паскаля.Люди, кто может, помогите решить плиз,...

Дана матрица 5х5. Вывести ее в верхнем треугольном ви-де (т.е. напечатать только элементы верхнего треугольника и именно в виде треугольника).
Дана матрица 5х5. Вывести ее в верхнем треугольном ви-де (т.е. напечатать...

Дано число K (<10) и текстовый файл, содержащий более К строк. Удалите из файлу первые К строк
Дано число K (&lt;10) и текстовый файл, содержащий более К строк. Удалите из файлу...

9
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
17.10.2015, 22:13 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Можно так - с одним массивом вместо матрицы
Pascal
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
program PascalTriangle;
 
var
  a: array[1..100] of integer;
  n: integer;
  i, j: integer;
  tmp1, tmp2: longint;
begin
  readln(n);
  a[1] := 1;
  for i := 1 to n do
  begin
    tmp2 := a[1];
    for j := 1 to i do
    begin
      if j >= 2 then
      begin
        tmp1 := a[j];
        a[j] := tmp2 + a[j];
        tmp2 := tmp1;
      end;
      Write(a[j]: 6);
    end;
    writeln;
  end;
end.
или с матрицей - в поиске.

Добавлено через 33 минуты
Или даже чуть короче
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program PascalTriangle;
 
var
  a: array[1..34] of longint;
  n: integer;
  i, j: integer;
  tmp1, tmp2: longint;
begin
  readln(n);
  a[1] := 1;
  for i := 1 to n do
  begin
    for j := 1 to i do
    begin
      tmp1 := a[j];
      if j >= 2 then
        a[j] := tmp2 + a[j];
      tmp2 := tmp1;
      Write(a[j]: 10);
    end;
    writeln;
  end;
end.
0
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
06.08.2017, 09:14 3
Что-то вспомнил сегодня об этом треугольнике и понял, что можно обойтись без ветвления в теле цикла - ведь вычисление a[j] при помощи tmp2 пропускается всего один раз. И присвоив перед циклом по j переменной tmp2 значение, которое не будет влиять на первый результат, можно избавиться от ветвления.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program PascalTriangle;
 
var
  a: array[1..34] of longint;
  n: integer;
  i, j: integer;
  tmp1, tmp2: longint;
begin
  readln(n);
  a[1] := 1;
  for i := 1 to n do
  begin
    tmp2 := 0;
    for j := 1 to i do
    begin
      tmp1 := a[j];
      a[j] := tmp2 + a[j];
      tmp2 := tmp1;
      Write(a[j]: 10);
    end;
    writeln;
  end;
end.
0
Puporev
Модератор
55444 / 42560 / 29412
Регистрация: 18.05.2008
Сообщений: 100,678
06.08.2017, 10:28 4
Добавим вариант равнобедренного треугольника.
Pascal
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
uses crt;
var
  a: array[1..13] of integer;
  n, i, j, k, w, tmp1, tmp2: integer;
begin
clrscr;
repeat
write('Введите количество строк от 1 до 13 n=');
readln(n);
until n in [1..13];
a[1] := 1;
w:=6*((n-i)div 2);
for i := 1 to n do
 begin
  for k:=1 to w do write(' ');
  tmp2 := 0;
  for j := 1 to i do
   begin
    tmp1 := a[j];
    a[j] := tmp2 + a[j];
    tmp2 := tmp1;
    Write(a[j]: 6);
   end;
  writeln;
  w:=w-3;
 end;
readln
end.
1
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4145 / 2738 / 2173
Регистрация: 22.11.2013
Сообщений: 7,648
06.08.2017, 21:06 5
Puporev,
вместо этого цикла
Pascal
15
for k:=1 to w do write(' ');
достаточно
Pascal
15
  Write('':w);
0
Puporev
Модератор
55444 / 42560 / 29412
Регистрация: 18.05.2008
Сообщений: 100,678
07.08.2017, 09:02 6
Да, только
Pascal
1
Write(' ':w);
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4145 / 2738 / 2173
Регистрация: 22.11.2013
Сообщений: 7,648
07.08.2017, 13:48 7
Puporev,
зачем? Вполне достаточно пустой строки. Или вам не нравятся те пробелы, что выводятся для выравнивания и зачем-то хочется один свой уникальный?
0
Puporev
Модератор
55444 / 42560 / 29412
Регистрация: 18.05.2008
Сообщений: 100,678
07.08.2017, 13:56 8
Честно никогда не задумывался. Просто не знал этого.
0
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
16.08.2017, 11:08 9
Прошу прощения, за ещё один подъём темы.

В интернете (https://ru.wikibooks.org/wiki/Язык_Си_в_примерах/Треугольник_Паскаля) увидел решение на C:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
    Вычисление n-й строки треугольника Паскаля.
*/
#include <stdio.h>
#define N 1000
 
int
main ()
{
  long c[N];
  long n, i, j;
  scanf ("%ld", &n);
  for (i = 1; i <= n; i++)
    c[i] = 0;
  c[0] = 1;
  for (j = 1; j <= n; j++)
    for (i = j; i >= 1; i--)
      c[i] = c[i - 1] + c[i];
  for (i = 0; i <= n; i++)
    printf ("%ld ", c[i]);
  return 0;
}
В целом оно повторяет моё решение на Pascal, но есть существенное отличие - вычисление строки производится не слева направо, а справа налево, что приводит к "автоматической" реализации очереди.
На Pascal это будет выглядеть так.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program PascalTriangle;
 
var
  a: array[0..33] of longint;
  n: integer;
  i, j: integer;
begin
  readln(n);
  for i := 1 to n - 1 do
    a[i] := 0;
  a[0] := 1;
  for j := 0 to n - 1 do
  begin
    for i := j downto 1 do
    begin
      a[i] := a[i - 1] + a[i];
      Write(a[i]: 10);
    end;
    writeln(a[0]: 10);
  end;
end.
Это не совсем точный перевод с языка на язык. И в переводе есть формальная некорректность - воспользовавшись симметрией строки, вывожу её в обратном порядке. Можно устранить, организовав самостоятельный цикл для вывода строки.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4145 / 2738 / 2173
Регистрация: 22.11.2013
Сообщений: 7,648
16.08.2017, 19:08 10
9-10:
если a -- статическая переменная, то опустить, иначе FillChar или более подходящие случаю Fill* для размера Longint:
Pascal
9
  FillChar(a,SizeOf(a),#0);
16: хоть и косметика, но
Pascal
16
    Inc(a[i],a[i-1]);
Да и самостоятельный цикл не проблема:
Pascal
12
13
14
15
  for j:=0 to n-1 do begin
    for i:=j downto 1 do Inc(a[i],a[i-1]);
    for i:=j downto 0 do Write(a[i]:10); WriteLn;
  end;
Вообще говоря, попытка собрать пачку действий внутри одного цикла смотрится выгодно, но не всегда соответствует ожиданиям...
1
16.08.2017, 19:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2017, 19:08

Напечатать первые n нечетных чисел
Напечатать первые n нечетных чисел

Напечатать первые вхождения букв в текст
дан текст из строчных латинских букв,за которыми,следует точка.напечатать...

Напечатать первые n членов арифметической прогрессии
Напечатать первые n членов арифметической прогрессии с первым членом a1 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru