![]() |
паскаль, вы программер?
вот собственно не могу разхобраться с длинной арифметикой,
Составить программу для вычисления точного значения суммы 1!+2!+3!+..+n! при n>10. может кто подскажет задачу?) народ кто в блок-схемах фарит? оч нужно к ней: program two; uses crt; const MAX=20; type line=Array[1..MAX] of real; var smin:real; imin:Integer; i,j,n,m:Integer; x:Array[1..MAX] of line; buf:line; juf:Array[1..MAX] of Integer; inp:Text; begin Assign(inp,'matrix.txt'); Reset(inp); Read(inp,n,m);{Є®«ЁзҐбвў® бвp®Є Ё бв®«Ўж®ў} if (MAX<n) or (MAX<m) then Write('*Ґ¦Ґ«*о бзЁв*вм! ') else begin for i:=1 to n do for j:=1 to m do Read(inp,x[i][j]); for i:=1 to n do begin buf[i]:=x[i][1]; juf[i]:=1; for j:=2 to m do if buf[i]<x[i][j] then begin buf[i]:=x[i][j]; juf[i]:=j end end; smin:=buf[1]; for i:=2 to n do begin if smin>buf[i] then begin smin:=buf[i]; imin:=i end end; Writeln; Write('‘Ґ¤«®ўaп в®зЄa x=',juf[imin],' y=',imin) end; Close(inp) end. вот. |
может это поможет разобраться:
Задача: Рекурсивная функция, считающая факториал числа. Код: Код:
|
Блин начни сам составлят ьблок схему - только перед этим приведи прогу к нормальному виду - всмысле чтобы циклы и фунции шли с отступом - ка ктолько отформатишь - блок схему ля такой мелкой программки ты сам напишешь как два пальца об асфальт.
|
собственно насчет задачи я, эта прога считает факториал(до 33 ), но мне надо вида:
1!+2!.. до вводимого числа о0 вот. |
Writeln('vvedite chislo');
Readln(n); sum:=0; fact:=1; for i:=1 to n do begin fact:=fact*i; sum:=sum+fact; end; writeln(sum); readln; end. Это без выпендрежа - голый алгоритм вычисления. |
Чуваку нужна длинная арифметика. Представленные листинги на паскале умрут после 18! - проверено еще в 96 году прошлого века.
to rubik-nerubik пиши модуль работы с длинной арифметикой, или качай из сети. |
ай мама моя дорогая... какое ж это западло - стандартный инт вешаеться после факториала 18...
А Double? а самому написать объект? И определить для него методы? (подсказка - определяешь массив(можно динамический) и в каждый элемент - помещаешь число - от 1-до 10 - вот тебе интерпретация числа. И просто напросто пишешь для него функцию умножения - типа там смещаться должно туда-то итд - сам напиши - полезно для мозгов). Но это если уж тебе совсем надо большой факториал найти. А если так по мелочи дабла должно хватить. А вот за рекурсию я бы нафиг руки отрубал... ПС проверять тут нечего - детская программа - все устно считаеться на сколько у тебя хватит размерности. |
Lexx, вы много знаете о haskell? :) Программами на этом языке нужно любоваться) А вы так про реккурсию плохо отзываетесь :mad:
rubik-nerubik, надыбай модуль для работы с длиннющими числами и вот те с longint, реккурентное соотношение нашел, функцию написал), работает реактивно и никаких циклов! Паскаль: Код:
program Good; |
Ага офигенно - вот какраз про это я и говорю... А вы когда-нить слышал и о таком предмете как исследование операций? Так вот - рекурсия - это худщшее что может быть для вычиления каки-бы то ни было больших или маленьких чисел...
А еще блин ну что это такое... рекурсией каждый раз считать факториал... Просто стот сравнить количество операций для вычиления всего задания по моему алгоритму и по вашему... У мен якаждый раз мы используем предыдущий член - тот который уже вычислен. Конечно это неявная рекурсия, но здесь она вполне допустима - нету операций с плавающей точкой. А предыдущая программа как раз и захлебнеться, причем скорее всего где-то в районе 150-200. - Только из-за недостатка оперативы... А нет даже раньше - у паскаля задействовано памяти на 600 000 интовых элементов. так что считаем... |
~Lexx~
флудишь больше))) HulkRus этот пример точно по моему заданию? не только факториал?? Составить программу для вычисления точного значения суммы 1!+2!+3!+..+n! при n>10. ????? |
Lex, для больших то чисел то да. прав. Но еще важен и сам алгоритм, например числа Фиббоначи нужно считать не через f<-f(x-1)+f(x-2) и не через 0.5(-1+sqrt(5)), а через матрицы!
rubik-nerubik, да. Она считает сумму факториалов (1!+2!+3!...), ты только тип возьми побольше |
Цитата:
У халка - просто процедура вычисления факториала - которая хороша, когда тебе нужн опоститать ТОЛЬКО факториал и только ОДИН раз. То HulkRUS Я не совсмем понял что ты сказал... Если ты утверждаешь что в вычислительных алгоритмах рекурсия это хорошо - почитай что-нибудь об исследовани операций. А уж по поводу чисел фибоначи - это вобще для чего было сказано? Чтобы показать, что ты знаешь что это такое? ПЫ извиняюсь за флуд. |
rubik-nerubik
ну ты извращенец У тебя кучу ошибок в коде и вообще юзай HELP. И вопросик а куда ты там собираешся выводить данные так ака я не увидел там assign (output,'output.txt'); rewrite (output); оооо эо ужас..... |
Chrek625 предлагай альтернативу а не обсирай =\ так и я могу написать, типа гавно, покажи свой в таком случае =\
~Lexx~ ещё раз говорю, мне ненадо просто посчитать факториал, как ты понимаешь, поставлена задача посчитать именно по образцу, а не так =\ |
и кстати если ты собираешся считать фаториалы то врятли тебе тут поможет integer скорее тебе понадобится longint.
|
Слушай выложи сюда то что у тебя в файле matrix.txt
попробую тебе помочь... |
Цитата:
|
Нет, я предложил тоже решение задачи. Ведь у меня находит не факториал, а их сумму (1!+2!+3!...). Lexx, мой алгоритм при больших числах некорректен, но сама идейка-то
1!+2!+3!+4!+5! = (1+2(1+3(1+4(1+5)))), в стек загоняет то, что в скобках. |
вот попробуй мою прогу
program fak; var a,fak,prob:array [1..10000] of integer; i,m,n,m1,k,j:longint; s,s1:string; Procedure Mnog(x,y:array of integer); var k,l:longint; begin fillchar(prob,sizeof(prob),0); for k:=1 to m1 do for l:=1 to m do prob[k-1+l]:=prob[k-1+l]+fak[l]*a[k]; k:=1; while k<=m do begin if ((prob[k] div 10) > 0)and(k=m) then inc(m); prob[k+1]:=prob[k+1]+(prob[k] div 10); s:=''; str(prob[k],S); prob[k]:=ord(s[length(s)])-ord('0'); inc(k); end; fak:=prob; end; begin { TODO -oUser -cConsole Main : Insert code here } assign(input,'input.txt'); reset(input); assign(output,'ouptupt.txt'); rewrite(output); readln(n); str(n,S); k:=1; for j:=length(s) downto 1 do begin fak[length(s)+1-j]:=ord(s[j])-ord('0'); end; m:=length(s); for i:=n-1 downto 2 do begin s1:=''; str(i,S1); k:=1; for j:=length(s1) downto 1 do begin a[length(s1)+1-j]:=ord(s1[j])-ord('0'); end; m1:=length(s1); mnog(fak,a); end; for i:=m downto 1 do write(fak[i]); writeln; close(input); close(output); end. З.Ы. по идее то что ты и хотел считает до 1000 (мона и больше) |
а зочем сдесь моссивы интежеров? Не проще ли создать байт? И почему нету отдельных бъектов? Если уж делоть, так делоть до конца.... (Повыступаю в роли критика))) )
|
интгер на всяк случай ставил тамучто при умножнии
99999999999 на 99999999 же в 5 ячейке массива буит храницца 9*9+9*9+9*9+9*9+9*9=324 что привышат байт, а обьекты ет на любителя , тем более прога не такая большая З.Ы. Если вопросы есть с удовольствием отвечу =) |
2~Lexx~ проще, но грамотное использование Integer эффективнее скажется на работе с длинными числами. перейдя в систему исчисления 10000, а лучше с longint в 100000000 количество операций с отдельными элементами массива для одного и того же числа будет в разы меньше. причем 10^n берется исключительно из-за удобства быстрого ввода\вывода таких чисел.
|
Ну как быэто грамотнее объяснить
максимальный объем стека паскаля - 65520 байт. BYte = 1 byte Integer = 2 byte таким образов в весь стек у тебя поместиться 32760 интежеровских переменных и 65520 байтовых. при грамотно организованной функции умножения у тебя бедут одновременно использоваться только соседние разряды - и значение элементов массивов не будет превосходить байтовую величину(компилятор же считает таким образом - это нуно делать на уровне двоичных кодов). К тому же в любом случае у тебя байт будет умножаться на байт быстрее чем два байта на два байта. (если не ошибаюсь где то на 25% быстрее). |
на самом деле нельзя написать на паскале программу которая бы высчитывала факториалы даже на половину просто нет такого типа данных в рамки которого можно внести там 33 факториала....
Если только на теории.... я имею ввиду полностью рабочую программу... |
ну простите... а как же пользовательские типы данных? а то что я писал- это так пустой звук? попробуй запустить мою програмку - на каких числах она отвалиться, если поставить тип данных extended... 10 байт на элемент - 3,4x10-4932 - 1,1x104932... помоему должно хватить )))
|
Простите не подумал просто не пользовался ни ризу этим типом данных для того что я делаю (простые школьные и не только задачи ) лонгейта хватало с крышей
|
~Lexx~ моя ,должна не отвалиться даже на 1000! если можешь обьясни чем она плоха
|
Я товю программу не запускал -у мея счас нету паскаля на компе - он у меня исчез далеко на первом курсе. Просто я говою о нецелесообразности твоей программы - у нее и выч сложность на порядок больше моей и она еще не являеться Объектно-ориентированой. К тому же что за бяка - как ты передаешь в процедуру массив, который у тебя число... ну просто омерзительно - надо создать свой тип и передавать ссылку! того типа.
|
понемаешь , моя тока изза длинки в скороости проигрывает (я не говорю, что мой код-идеал)
|
Цитата:
И зачем тогда усложнят алгоритм, если в итоге получили медленно работающую программу, с неграмотной передачей в процедуры. Которая ктому же жрет непойми сколько места. Плюс ты ее тестил? Попробуй - что то мне подсказывает, что она непапрет для заявленной 1000! |
на 1000! она выдает ответ ~1 cек, компилятор делфи 7, проц атлон 3500+ (на правильность проверял малые тесты работала верно )
З.Ы. твоя прога 30! не вазьмет а по ресурсом буит хавать столькоже скока и моя (если динку допишешь) З.З.Ы. я не думаю ято моя прога работает медленно паетотму я опустил красату и компактность кода |
~Lexx~ )))) опять флуд)))\
мне нужна работающая программа. все. )))) завтра смогу протестить прогу беефа |
>>К тому же в любом случае у тебя байт будет
>>умножаться на байт быстрее чем два байта на два >>байта. (если не ошибаюсь где то на 25% быстрее). вполне очевидно, что ДАЖЕ проходя два байта в два раза медленнее мы пройдем всю длину в два раза быстрее) |
Цитата:
Что может быт ьпроще - каждый раз вычислять значение факториала - используя предыдущий факториал и тут же его суммировать... Неужели такие люди считают себя айтишниками... Это же простейшая программа класса 9. Оставь мечты стать программистом... Какая к черту красота и компактонсть кода - жуткий гибрид рекурсии и неумелая попытка передавать ф процедуру глобальный параметр... тыб еще сразу его начил фигачить. Прошу прощения у всех остальных пользователей - не сдержался. |
~Lexx~ если не трудно напиши свою прогу ибо из твоих рассуждений ничего не понял,а там посмотрим
|
ой мама родите меня обратно
дубль три) Uses crt; var i,n:integer; fact,sum:extended; Begin ClrScr; Writeln('vvedite chislo'); Readln(n); sum:=0; fact:=1; for i:=1 to n do begin fact:=fact*i; sum:=sum+fact; end; writeln(sum); readln; end. |
последний вопрос , а с точностью что ты будешь делать?
|
во первых какя тебе нужна точность? если тебе так нужно - завтра послезавтра выложу специальн одля тебя по человечески сделанную с пользовательскими типами и переопределением методов.
Вот как бы появилось пару вопросов по твоей прогрмме - а зачем ты крепишь текстовый файл? для понта? во вторых - у тебя сразу же пойдет переполнение стэка - подумай почему. Вернее не сразу, а когда оно начнет считать. |
Цитата:
|
текстовые делал тамучто мне так тестить было удобней , на практике переполнения не было , обьесни почему оно буит...
|
| Время: 13:21 |