Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Программа, вычисляющая число сочетаний c из n по k на Паскале.  (Прочитано 7208 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Walter Milberght, ты бы хоть код показал...
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Факториал нужен для решения этой задачи напрямую - по формуле для C из n по k. Я не знаю паскаля, однако, как мне кажется, через факториал может быть проще, хотя нет гарантии, что быстрее и менее прожорливо.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Для наиболее быстрого кода проще составить такой алгоритм:

Ищем  значение сочетаний в файле
Если значение не найдено, то вычисляем его через треугольник Паскаля или факториалы (для больших чисел факториал, имхо, выгоднее будет) и записываем значение в файл, для последующего использования и выводим значение на экран. Иначе, просто выводим значение.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Факториал нужен для решения этой задачи напрямую - по формуле для C из n по k. Я не знаю паскаля, однако, как мне кажется, через факториал может быть проще, хотя нет гарантии, что быстрее и менее прожорливо.

Для больших чисел - см. формулу Стирлинга.

Шинш

  • Гость
Protopopulus,
а, все, вспомнил )) эт дискретка :D у меня еще в курсе даж открытый раздел с лекциями еще остался :D
если автору нужно и у него нету еще такого, могу скинуть лекцию в pdf с сайта, там и Стирлинг и Белл, и прочее по комбинаторике :)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
(Нажмите, чтобы показать/скрыть)

Факториал нужен для решения этой задачи напрямую - по формуле для C из n по k. Я не знаю паскаля, однако, как мне кажется, через факториал может быть проще, хотя нет гарантии, что быстрее и менее прожорливо.
Главное каждую итерацию не высчитывать факториал заново.
А то скорее яишницу поджаришь на процессоре чем результат получишь.
Сохраняйте предыдущее значение и просто на следующем шаге домножайте.
Хотя, ой, о чем это я?.. это для разложения в ряд Тейлора.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Yurror, главное - функцию не вызывать рекурсивно!
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн astrobeglec

  • Активист
  • *
  • Сообщений: 838
  • Самая тяжелая ноша - пророк в извращенном мире...
    • Просмотр профиля
Факториал в Паскалевом треугольнике нужен как собаке пятая нога, то есть, никак. Исправил код, скомпилил - программа при вводе любых чисел (положительных) завершается с непонятной ошибкой, причем завершается с такой скоростью, что прочитать невозможно.
Добавь точки останова и отдебажь.
Я вернулся...

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Кстати, а что, в Паскале нет функции факториала?..

Пользователь решил продолжить мысль 05 Ноября 2012, 13:06:23:
Нашел интересную ссылку, кстати:
http://ru.wikibooks.org/wiki/Примеры_реализации_функции_факториал

Там сразу куча языков и по два варианта - рекурсивно и нет.
« Последнее редактирование: 05 Ноября 2012, 13:06:23 от Phlya »
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Walter Milberght

  • Автор темы
  • Участник
  • *
  • Сообщений: 196
    • Просмотр профиля
Protopopulus,
а, все, вспомнил )) эт дискретка :D у меня еще в курсе даж открытый раздел с лекциями еще остался :D
если автору нужно и у него нету еще такого, могу скинуть лекцию в pdf с сайта, там и Стирлинг и Белл, и прочее по комбинаторике :)

Кидай, пригодится.

Разобрался, прога заработала.


program C_iz_n_po_k;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  A:array of longword;
  i,j,k,n:longword;

begin

while 0=0 do
  begin
    writeln('Input n and k ');

    writeln('Input n ');
    read(n);

    writeln('Input k ');
    read(k);

    setlength(A,k+1);

    for i:=0 to k do A[i]:=1;
    for j:=1 to n-k do for i:=1 to k do A[i]:=A[i]+A[i-1];

    writeln('C iz n po k = ', A[k]);
    readln;
  end;
end.
Все для нации, ничего против нации, нация превыше всего!

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Walter Milberght, а препод не придерется к тому, что у тебя программа только по Ctrl + C завершается? :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Шинш

  • Гость
Walter Milberght,
http://rusfolder.com/33465724
http://rusfolder.com/33465726

З.Ы. первый раз этим файлообмеником пользуюсь, если что не ругайте ...

Пользователь решил продолжить мысль 05 Ноября 2012, 21:01:13:
Protopopulus,
а почему по ctrl+C ? вроде там правельно циклы?(pascal знаю вообще поверхностно, и то из инета и сейчас... сразу с плюсов начинал, так что не ругайте и за это ) ...
« Последнее редактирование: 05 Ноября 2012, 21:01:13 от Шинш »

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Шинш, а у него нет условий выхода из цикла, вот и придется завершать по Ctrl + C.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Шинш

  • Гость
Protopopulus,
а, нашел )) не туда смотрел ))

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Прошу прощения, проглядел.

...
double i, j, k, n;
...
и разве scanf не требует формата принимаемого типа?
в данном случае scanf ("%f", &n);
...

Ай яй яй... исправляйся живо!
Но вообще твой С++ вариант был правильным. Это один из плюсов С++ =) конкретно с потоками ввода/вывода в С++ напортачить сложнее. Во всем остальном легче =) Так что не расслабляйся.

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.