Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2011, 18:39   #1
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию Деление многочлена на многочлен

Как это сделать?
Многочлен представлен в виде динам списка пар(степень, многочлен).
nicklifs вне форума Ответить с цитированием
Старый 10.12.2011, 20:42   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Найди на просторах Интернет книжку: Компьютерная алгебра.
Как-то так: coaBook.pdf.
Там есть большая часть ответа на поставленный вопрос.
В том числе и код на Паскале и не только.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.12.2011, 21:50   #3
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

А автора или год издания не подскажите, не могу найти.
nicklifs вне форума Ответить с цитированием
Старый 10.12.2011, 22:00   #4
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

Книгу нашёл... исходника там и близко нет, только для умножения.
nicklifs вне форума Ответить с цитированием
Старый 10.12.2011, 22:42   #5
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

type pnode=^node;
node=record
a:real;
q:integer;
prev, nextnode;
end;

var head,tail, head2,tail2, rhead,rtailnode;


//деление 1 (head,tail) на второй (head2,tail2) многочлен
procedure del;
var p,r,z,newnode,one,tone,two,ttwo,otn ,totn,result,tresultnode;
a:real;
q:integer;
begin
if ((head<>nil) and (head2<>nil)) then begin
one:=nil; tone:=nil; two:=nil; ttwo:=nil; result:=nil; tresult:=nil;
p:=head;
while p<>nil do begin
newnode:=createnode(p^.a,p^.q);
addend(one,tone,newnode);
p:=p^.next;
end;
p:=head2;
while p<>nil do begin
newnode:=createnode(p^.a,p^.q);
addend(two,ttwo,newnode);
p:=p^.next;
end;

p:=one; r:=two;
while p<>nil do begin
if p^.q<r^.q then break;
a:=p^.a/r^.a;
q:=p^.q-r^.q;
newnode:=createnode(a,q);
addend(result,tresult,newnode);
otn:=nil; totn:=nil;
z:=head2;
while z<>nil do begin
newnode:=createnode(z^.a*a,z^.q+q);
addend(otn,totn,newnode);
z:=z^.next;
end;

minus(one,tone,otn,totn);

p:=one;
end;


write('Результат деления: ');
print(result,tresult);
if p<>nil then begin
write('+(');
print(one,tone);
write(')/(');
print(two,ttwo);
writeln(')');
end;
writeln;

end
else writeln('Îøèáêà. Îäèí èëè îáà ìíîãî÷ëåíà íå ñîçäàíû.')
end;


//вычитание из многочлена one многочлен two, запись в one
procedure minus(var one,tone,two,ttwonode);
var p,q,rhead,rtai,newnodenode;
begin


rhead:=nil; rtail:=nil;
p:=one;
while p<>nil do begin
newnode:=createnode(p^.a,p^.q);
addend(rhead,rtail,newnode);
p:=p^.next;
end;
p:=two;
while p<>nil do begin
newnode:=createnode(p^.a*-1,p^.q);
addend(rhead,rtail,newnode);
p:=p^.next;
end;

preobr(rhead,rtail);

one:=rhead; tone:=rtail;
rhead:=nil; rtail:=nil;
end;
nicklifs вне форума Ответить с цитированием
Старый 10.12.2011, 22:42   #6
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

//преобразование многочлена
procedure preobr(var rhead,rtailnode);
var thead,ttail,p,newnode,qnode;
tempa:real;
begin
sort(rhead,rtail);
ttail:=nil; thead:=nil;
p:=rhead;
tempa:=p^.a;
p:=p^.next;
while p<>nil do begin
if p^.q=p^.prev^.q then tempa:=tempa+p^.a
else
begin
if tempa<>0 then begin
newnode:=createnode(tempa,p^.prev^. q);
addend(thead,ttail,newnode);
end;
tempa:=p^.a;
end;

if p^.next=nil then begin
if tempa<>0 then begin
newnode:=createnode(tempa,p^.q);
addend(thead,ttail,newnode);
end;
end;
p:=p^.next;
end;

q:=rhead;
while q<>nil do begin
p:=q;
q:=q^.next;
dispose(p);
end;
rhead:=thead;
rtail:=ttail;

end;


// сортировка пузырком
procedure sort(var head,tailnode);
var a:array [1..50] of pnode;
p,temp,temp2node;
i,j,n:integer;
begin
if head<>nil then begin
p:=head;
i:=1;
while p<>nil do begin
a[i]:=p;
p:=p^.next;
if p<>nil then i:=i+1;
end;
head:=nil; tail:=nil;
n:=i;

for i:=1 to n-1 do begin
for j:=n-1 downto i do begin
temp:=a[j];
temp2:=a[j+1];
if temp^.q<temp2^.q then begin
p:=a[j];
a[j]:=a[j+1];
a[j+1]:=p;
end;
end;
end;

for i:=1 to n do addend(head,tail,a[i]);
end
else writeln('Ошибка.');
end;



Работает только если второй(на который делим) многочлен состоит из одного элемента
nicklifs вне форума Ответить с цитированием
Старый 11.12.2011, 15:28   #7
nicklifs
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 32
По умолчанию

В чём ошибка? Помогите.
nicklifs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ вычислить многочлен vlas Помощь студентам 0 24.10.2010 12:45
Подстановка в многочлен pasha92 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 28.05.2010 20:20
Многочлен чебышева Rыся Помощь студентам 2 11.01.2010 08:37
Многочлен. Chudo4258 Помощь студентам 2 10.05.2009 14:02
Интерполяционный многочлен лагранжа 3.14oner Паскаль, Turbo Pascal, PascalABC.NET 2 10.11.2008 17:30