PDA

Просмотр полной версии : паскаль, вы программер?


rubik-nerubik
10.12.2007, 21:00
вот собственно не могу разхобраться с длинной арифметикой,
Составить программу для вычисления точного значения суммы 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.

вот.

LolFEm
10.12.2007, 21:41
может это поможет разобраться:
Задача:
Рекурсивная функция, считающая факториал числа.


Код:





program Factorial;
var n:integer;

function Factor(n:integer):real;
var v:real;
Begin
if n in [0,1] then Factor:= 1 else Factor:= n*Factor(n-1);
end;

begin
Write('Введите число(0..33): ');
Readln(n);
Write('Факториал этого числа равен: ', Factor(n):11:0);
Readln;
End.

~Lexx~
11.12.2007, 04:28
Блин начни сам составлят ьблок схему - только перед этим приведи прогу к нормальному виду - всмысле чтобы циклы и фунции шли с отступом - ка ктолько отформатишь - блок схему ля такой мелкой программки ты сам напишешь как два пальца об асфальт.

rubik-nerubik
12.12.2007, 20:38
собственно насчет задачи я, эта прога считает факториал(до 33 ), но мне надо вида:
1!+2!.. до вводимого числа о0 вот.

~Lexx~
13.12.2007, 00:54
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.

Это без выпендрежа - голый алгоритм вычисления.

Aristarh Dark
13.12.2007, 07:36
Чуваку нужна длинная арифметика. Представленные листинги на паскале умрут после 18! - проверено еще в 96 году прошлого века.
to rubik-nerubik пиши модуль работы с длинной арифметикой, или качай из сети.

~Lexx~
13.12.2007, 17:02
ай мама моя дорогая... какое ж это западло - стандартный инт вешаеться после факториала 18...
А Double? а самому написать объект? И определить для него методы? (подсказка - определяешь массив(можно динамический) и в каждый элемент - помещаешь число - от 1-до 10 - вот тебе интерпретация числа. И просто напросто пишешь для него функцию умножения - типа там смещаться должно туда-то итд - сам напиши - полезно для мозгов). Но это если уж тебе совсем надо большой факториал найти. А если так по мелочи дабла должно хватить. А вот за рекурсию я бы нафиг руки отрубал...

ПС проверять тут нечего - детская программа - все устно считаеться на сколько у тебя хватит размерности.

HulkRus
13.12.2007, 17:35
Lexx, вы много знаете о haskell? :) Программами на этом языке нужно любоваться) А вы так про реккурсию плохо отзываетесь :mad:
rubik-nerubik, надыбай модуль для работы с длиннющими числами и вот те с longint, реккурентное соотношение нашел, функцию написал), работает реактивно и никаких циклов! Паскаль:
program Good;
uses crt;
var
k,max:byte;
function fuck(k:byte):longint;
begin
if k=1 then fuck:=1
else fuck:=(max-k+2)*fuck(k-1)+1;
end;
begin
readln(k); max:=k;
writeln(fuck(k));
end.

~Lexx~
13.12.2007, 19:23
Ага офигенно - вот какраз про это я и говорю... А вы когда-нить слышал и о таком предмете как исследование операций? Так вот - рекурсия - это худщшее что может быть для вычиления каки-бы то ни было больших или маленьких чисел...
А еще блин ну что это такое... рекурсией каждый раз считать факториал... Просто стот сравнить количество операций для вычиления всего задания по моему алгоритму и по вашему...
У мен якаждый раз мы используем предыдущий член - тот который уже вычислен. Конечно это неявная рекурсия, но здесь она вполне допустима - нету операций с плавающей точкой.
А предыдущая программа как раз и захлебнеться, причем скорее всего где-то в районе 150-200. - Только из-за недостатка оперативы... А нет даже раньше - у паскаля задействовано памяти на 600 000 интовых элементов. так что считаем...

rubik-nerubik
13.12.2007, 19:30
~Lexx~
флудишь больше)))

HulkRus этот пример точно по моему заданию? не только факториал??
Составить программу для вычисления точного значения суммы 1!+2!+3!+..+n! при n>10.
?????

HulkRus
13.12.2007, 19:34
Lex, для больших то чисел то да. прав. Но еще важен и сам алгоритм, например числа Фиббоначи нужно считать не через f<-f(x-1)+f(x-2) и не через 0.5(-1+sqrt(5)), а через матрицы!
rubik-nerubik, да. Она считает сумму факториалов (1!+2!+3!...), ты только тип возьми побольше

~Lexx~
13.12.2007, 20:05
~Lexx~
флудишь больше)))

HulkRus этот пример точно по моему заданию? не только факториал??
Составить программу для вычисления точного значения суммы 1!+2!+3!+..+n! при n>10.
?????

Прости - я тебе написал именно то что ты просил - и я считаю , что если тебе не требуеться вычисление факториалов типа 1000! или больше - тебе мой алгоритм подойдет - и будет лучшим, что можно предложить из простого. А те алгоритмы которые по 10 раз вычисляют одно и то же - даже не имеют правол на существование.

У халка - просто процедура вычисления факториала - которая хороша, когда тебе нужн опоститать ТОЛЬКО факториал и только ОДИН раз.

То HulkRUS

Я не совсмем понял что ты сказал... Если ты утверждаешь что в вычислительных алгоритмах рекурсия это хорошо - почитай что-нибудь об исследовани операций. А уж по поводу чисел фибоначи - это вобще для чего было сказано? Чтобы показать, что ты знаешь что это такое?

ПЫ извиняюсь за флуд.

Chrek625
13.12.2007, 20:25
rubik-nerubik
ну ты извращенец
У тебя кучу ошибок в коде и вообще юзай HELP.
И вопросик а куда ты там собираешся выводить данные так ака я не увидел там
assign (output,'output.txt');
rewrite (output);
оооо эо ужас.....

rubik-nerubik
13.12.2007, 20:34
Chrek625 предлагай альтернативу а не обсирай =\ так и я могу написать, типа гавно, покажи свой в таком случае =\

~Lexx~ ещё раз говорю, мне ненадо просто посчитать факториал, как ты понимаешь, поставлена задача посчитать именно по образцу, а не так =\

Chrek625
13.12.2007, 20:38
и кстати если ты собираешся считать фаториалы то врятли тебе тут поможет integer скорее тебе понадобится longint.

Chrek625
13.12.2007, 20:46
Слушай выложи сюда то что у тебя в файле matrix.txt
попробую тебе помочь...

~Lexx~
13.12.2007, 21:12
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.



то rubik-nerubik ой блин... ты когда-нить читаешь чужие посты? Вот мое второе сообщение в этой теме - это твое решение перед Алгоритмом объяви переменные каk longint. и все заработает. Ты хоть читаешь чужие коды или просто- чем больше написано, тем круче алгоритм? Халк тебе предложил рекурсивную функцию по нахождению факториала - я тебе написал решение всей твоей задачи...

HulkRus
13.12.2007, 21:20
Нет, я предложил тоже решение задачи. Ведь у меня находит не факториал, а их сумму (1!+2!+3!...). Lexx, мой алгоритм при больших числах некорректен, но сама идейка-то
1!+2!+3!+4!+5! = (1+2(1+3(1+4(1+5)))), в стек загоняет то, что в скобках.

Be0wuIf
13.12.2007, 23:13
вот попробуй мою прогу

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 (мона и больше)

~Lexx~
14.12.2007, 12:31
а зочем сдесь моссивы интежеров? Не проще ли создать байт? И почему нету отдельных бъектов? Если уж делоть, так делоть до конца.... (Повыступаю в роли критика))) )

Be0wuIf
14.12.2007, 12:55
интгер на всяк случай ставил тамучто при умножнии
99999999999 на 99999999 же в 5 ячейке массива буит храницца 9*9+9*9+9*9+9*9+9*9=324 что привышат байт,
а обьекты ет на любителя , тем более прога не такая большая
З.Ы. Если вопросы есть с удовольствием отвечу =)

ZaCo
14.12.2007, 12:56
2~Lexx~ проще, но грамотное использование Integer эффективнее скажется на работе с длинными числами. перейдя в систему исчисления 10000, а лучше с longint в 100000000 количество операций с отдельными элементами массива для одного и того же числа будет в разы меньше. причем 10^n берется исключительно из-за удобства быстрого ввода\вывода таких чисел.

~Lexx~
14.12.2007, 13:57
Ну как быэто грамотнее объяснить
максимальный объем стека паскаля - 65520 байт.

BYte = 1 byte
Integer = 2 byte
таким образов в весь стек у тебя поместиться 32760 интежеровских переменных и 65520 байтовых. при грамотно организованной функции умножения у тебя бедут одновременно использоваться только соседние разряды - и значение элементов массивов не будет превосходить байтовую величину(компилятор же считает таким образом - это нуно делать на уровне двоичных кодов). К тому же в любом случае у тебя байт будет умножаться на байт быстрее чем два байта на два байта. (если не ошибаюсь где то на 25% быстрее).

Chrek625
14.12.2007, 16:10
на самом деле нельзя написать на паскале программу которая бы высчитывала факториалы даже на половину просто нет такого типа данных в рамки которого можно внести там 33 факториала....
Если только на теории....
я имею ввиду полностью рабочую программу...

~Lexx~
14.12.2007, 16:58
ну простите... а как же пользовательские типы данных? а то что я писал- это так пустой звук? попробуй запустить мою програмку - на каких числах она отвалиться, если поставить тип данных extended... 10 байт на элемент - 3,4x10-4932 - 1,1x104932... помоему должно хватить )))

Chrek625
14.12.2007, 17:42
Простите не подумал просто не пользовался ни ризу этим типом данных для того что я делаю (простые школьные и не только задачи ) лонгейта хватало с крышей

Be0wuIf
14.12.2007, 19:28
~Lexx~ моя ,должна не отвалиться даже на 1000! если можешь обьясни чем она плоха

~Lexx~
14.12.2007, 19:36
Я товю программу не запускал -у мея счас нету паскаля на компе - он у меня исчез далеко на первом курсе. Просто я говою о нецелесообразности твоей программы - у нее и выч сложность на порядок больше моей и она еще не являеться Объектно-ориентированой. К тому же что за бяка - как ты передаешь в процедуру массив, который у тебя число... ну просто омерзительно - надо создать свой тип и передавать ссылку! того типа.

Be0wuIf
14.12.2007, 19:47
понемаешь , моя тока изза длинки в скороости проигрывает (я не говорю, что мой код-идеал)

~Lexx~
14.12.2007, 20:12
понемаешь , моя тока изза длинки в скороости проигрывает (я не говорю, что мой код-идеал)

Понимаешь - написать программу, которая рабоатет - подсилу каждому, а вот написать быстро работающую программу, которая при этом жрет мало ресурсов - вот это хинт.

И зачем тогда усложнят алгоритм, если в итоге получили медленно работающую программу, с неграмотной передачей в процедуры. Которая ктому же жрет непойми сколько места. Плюс ты ее тестил? Попробуй - что то мне подсказывает, что она непапрет для заявленной 1000!

Be0wuIf
14.12.2007, 20:20
на 1000! она выдает ответ ~1 cек, компилятор делфи 7, проц атлон 3500+ (на правильность проверял малые тесты работала верно )
З.Ы. твоя прога 30! не вазьмет а по ресурсом буит хавать столькоже скока и моя (если динку допишешь)
З.З.Ы. я не думаю ято моя прога работает медленно паетотму я опустил красату и компактность кода

rubik-nerubik
14.12.2007, 20:20
~Lexx~ )))) опять флуд)))\
мне нужна работающая программа. все. )))) завтра смогу протестить прогу беефа

ZaCo
14.12.2007, 21:06
>>К тому же в любом случае у тебя байт будет
>>умножаться на байт быстрее чем два байта на два
>>байта. (если не ошибаюсь где то на 25% быстрее).

вполне очевидно, что ДАЖЕ проходя два байта в два раза медленнее мы пройдем всю длину в два раза быстрее)

~Lexx~
14.12.2007, 22:02
на 1000! она выдает ответ ~1 cек, компилятор делфи 7, проц атлон 3500+ (на правильность проверял малые тесты работала верно )
З.Ы. твоя прога 30! не вазьмет а по ресурсом буит хавать столькоже скока и моя (если динку допишешь)
З.З.Ы. я не думаю ято моя прога работает медленно паетотму я опустил красату и компактность кода
Ты что в горестном епаме работаешь? Или всю жизнь на делфи работаешь? Ты считать умеешь? замени в моей программе лонгинт на экстендед - у тебя получиться больше 1500 элементов влазит в стек... программа выводиться за 1 секунду???? бля эт опо твоему скорость? Ты што упал? У меня на выполнение программы идет меньше восьмой части секунды - на третьем пне. Про динамическую память - ты вообще что-нибудь когда-нить на динамике писал? или в школе на уроках информатике услашыв, что такое ссылки и виртуальные методы возомнил себя программистом? Я вообще не понимаю о чем с тобой можно спорить, если ты не способен понять линейный итерационный алгоритм.
Что может быт ьпроще - каждый раз вычислять значение факториала - используя предыдущий факториал и тут же его суммировать... Неужели такие люди считают себя айтишниками... Это же простейшая программа класса 9. Оставь мечты стать программистом...

Какая к черту красота и компактонсть кода - жуткий гибрид рекурсии и неумелая попытка передавать ф процедуру глобальный параметр... тыб еще сразу его начил фигачить.

Прошу прощения у всех остальных пользователей - не сдержался.

Be0wuIf
14.12.2007, 22:45
~Lexx~ если не трудно напиши свою прогу ибо из твоих рассуждений ничего не понял,а там посмотрим

~Lexx~
14.12.2007, 23:23
ой мама родите меня обратно
дубль три) 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.

Be0wuIf
14.12.2007, 23:32
последний вопрос , а с точностью что ты будешь делать?

~Lexx~
14.12.2007, 23:37
во первых какя тебе нужна точность? если тебе так нужно - завтра послезавтра выложу специальн одля тебя по человечески сделанную с пользовательскими типами и переопределением методов.

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

VERte][
15.12.2007, 00:14
ой мама родите меня обратно
дубль три) 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.

аха-ха жжёшь) а если у тебя n за maxint выйходит?) и ты конечно крут с extended, если у тебя будет найти сумму 1!+..+n! где n=100000, то ты пролетишь))))

Be0wuIf
15.12.2007, 00:41
текстовые делал тамучто мне так тестить было удобней , на практике переполнения не было , обьесни почему оно буит...

~Lexx~
15.12.2007, 01:13
[']аха-ха жжёшь) а если у тебя n за maxint выйходит?) и ты конечно крут с extended, если у тебя будет найти сумму 1!+..+n! где n=100000, то ты пролетишь))))
БЛин ну простите - нету такого алгоритма который бы не используя динамическую память считал факториал100000. факториал 1600 - так считаеться и задача для 1500 идет... а дальше переполнение стека.

VERte][
15.12.2007, 01:35
ну ты собирался нормальный алгоритм представить, вот и покажи, потому что длинная арифметика вычисляется совсем не так, как ты показал)

~Lexx~
15.12.2007, 02:58
Молодой человек - если ты хоть раз писал что-нибудь, кроме гавеных сплойтов и вузовских программ ты должен был бы знать что основной функцией ооп являетсья независимость кода основной программы от модулей - и сейчас именно тот случай - я переопределю метод умножения, но алгоритм останеться прежним - мне его не надо будет менять, если кто-то забожит реализацию умножения лучше моего...

rubik-nerubik
15.12.2007, 16:39
это интересно конечно, флуд -))) но есть мера,

LExx напиши мне программу, хватит умничать, правда если ты сам хоть что-то умеешь =\

rubik-nerubik
15.12.2007, 16:52
на задачу Be0wu1fa
ругается тут
.........
var k,l:longint;
begin - Stack overlfow error
.........

Sn@k3
15.12.2007, 21:55
мда, что это все выше было?)))) тебе требовались процедуры длинного сложения и умножения.. ну че-то вроде того...


program Snak3;
var ss,s:string;
n,i,k:longint;
read(n);
s:=''; ss:='';
for i:=1 to n do
begin
for k:=1 to i do um(s,str(k),s);
sum(ss,s,ss);
end;
procedure um(a,b:string;var c:string);
var n,k,i,j,x,p:integer; d:string;
begin
n:=length(a);
k:=length(b);
c:=''; d:=''; p:=0;
for i:=1 to n+k do d:=d+'0';
for j:=k downto 1 do
begin
p:=0;
for i:=n downto 1 do begin
x:=(ord(a[i])-ord('0'))*(ord(b[j])-ord('0'))+p+ord(d[i+j])-ord('0');
d[i+j]:=chr((x mod 10)+ord('0'));
p:=x div 10;
end;
d[j]:=chr(ord(d[j])+p);
end;
i:=1;
n:=length(d);
while (d[i]='0') and (i<n) do inc(i);
for k:=i to n do c:=c+d[k];
end;
procedure raz(a,b:string;var c:string);
var x,n,k,i,p,g:integer;
d:string;
begin
n:=length(a);
k:=length(b);
if k<n then for i:=k+1 to n do b:='0'+b;
d:=''; c:=''; p:=0;
for i:=n downto 1 do
begin
if a[i]<b[i] then
begin
a[i-1]:=chr(ord(a[i-1])-1);
x:=10+ord(a[i])-ord(b[i]);
d:=chr(x+ord('0'))+d;
end
else begin
x:=ord(a[i])-ord(b[i]);
d:=chr(x+ord('0'))+d;
end;
end;
i:=1;
n:=length(d);
while (d[i]='0') and (i<n) do inc(i);
for k:=i to n do c:=c+d[k];
end;
function cmp(a,b:string):string;
var n,k,i:integer; c:string;
begin
n:=length(a);
k:=length(b);
c:='';
if n<k then c:='-' else
begin
if k<n then c:='+' else
begin
i:=1;
while ((a[i]=b[i])and(i<=n)) do inc(i);
if (a[i]<b[i]) then c:='-';
if (a[i]>b[i]) then c:='+';
if (i=n+1) then c:='=';
end;
end;
cmp:=c;
end;
procedure sum(a,b:string;var c:string);
var x,i,p,n,k:integer;
begin
n:=length(a);
k:=length(b);
p:=0;
c:='';
if n<k then begin
for i:=n+1 to k do
a:='0'+a;
end else
begin
for i:=k+1 to n do
b:='0'+b; end;
n:=length(a);
for i:=n downto 1 do
begin
x:=ord(a[i])-ord('0')+ord(b[i])-ord('0')+p;
c:=chr((x mod 10)+ord('0'))+c;
p:=x div 10;
end;
if p<>0 then
begin
inc(n);
c:='1'+c;
end;


те осталось переменные sum и um вывести ну или сохранить в файл....